python多线程简易版 - 线程池THREADPOOL及回调函数

系统 1657 0

threadpool

  • makeRequests的原型如下 def makeRequests(callable_, args_list, callback=None, exc_callback=_handle_thread_exception),可以看出第一个参数是线程将要启动任务函数,第二个是要传个任务函数的参数列表,第三个是回调函数,可以用于收集任务结束后的结果或者环境清理
  • args_list 中每一项要么是一个单独的变量,要么是一个2个元素的元组,该元组第1项是位置参数的列表,该元组的第2项是关键参数的字典(很绕口,但最重要
  • 任务函数的多参数,你可以统统通过位置参数列表传进去,也可以统统通过关键字参数字典传进去,也可以通过混合方式传进去
  • 例如你的任务函数有两个参数,一个是name,一个是age,那么你可以传args_list为[([‘python’, 12], None), ]这样的形式, None是未传递的关键字参数字典。
  • 也可以传args_list为[(None, {‘name’:‘python’, ‘age’: 12}), ]这样的形式,None是未传递的位置参数列表。
  • 还可以传args_list为[([‘python’], {‘age’: 12}), ]这样的形式,这就是混合形式
  • 个人感觉太灵活了,而且不好理解

以下是简单的4行代码:

            
              pool 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              
                10
              
              
                )
              
              
                #建立线程池,控制线程数量为10
              
              
reqs 
              
                =
              
               threadpool
              
                .
              
              makeRequests
              
                (
              
              get_title
              
                ,
              
               data
              
                ,
              
               print_result
              
                )
              
              
                #构建请求,
              
              
                #get_title为要运行的函数,data为要多线程执行函数的参数,
              
              
                #最后这个print_result是可选的,是对前两个函数运行结果的操作
              
              
                [
              
              pool
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              
                for
              
               req 
              
                in
              
               reqs
              
                ]
              
              
                #多线程一块执行
              
              
pool
              
                .
              
              wait
              
                (
              
              
                )
              
              
                #线程挂起,直到结束
              
            
          

创建线程池,线程数为10:

            
              pool 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              
                10
              
              
                )
              
            
          

创建线程请求,包涵调用的函数、参数和回调函数:

            
              requests 
              
                =
              
               threadpool
              
                .
              
              makeRequests
              
                (
              
              func
              
                ,
              
               args_list
              
                ,
              
               call_back
              
                )
              
              
                # 源代码
              
              
                # `args_list`` should be either a 2-item tuple of the list of positional arguments and a dictionary of keyword arguments or a single, non-tuple argument.
              
            
          

args_list必须是包含2个元素的元组,第一个是list,第二个是dict,如果线程函数需要多个参数,需要拼接list或者dict。

            
              
                # 方法1  
              
              
    lst_vars_1 
              
                =
              
              
                [
              
              
                '1'
              
              
                ,
              
              
                '2'
              
              
                ,
              
              
                '3'
              
              
                ]
              
              
    lst_vars_2 
              
                =
              
              
                [
              
              
                '4'
              
              
                ,
              
              
                '5'
              
              
                ,
              
              
                '6'
              
              
                ]
              
              
    func_var 
              
                =
              
              
                [
              
              
                (
              
              lst_vars_1
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              lst_vars_2
              
                ,
              
              
                None
              
              
                )
              
              
                ]
              
              
                # 方法2
              
              
    dict_vars_1 
              
                =
              
              
                {
              
              
                'm'
              
              
                :
              
              
                '1'
              
              
                ,
              
              
                'n'
              
              
                :
              
              
                '2'
              
              
                ,
              
              
                'o'
              
              
                :
              
              
                '3'
              
              
                }
              
              
    dict_vars_2 
              
                =
              
              
                {
              
              
                'm'
              
              
                :
              
              
                '4'
              
              
                ,
              
              
                'n'
              
              
                :
              
              
                '5'
              
              
                ,
              
              
                'o'
              
              
                :
              
              
                '6'
              
              
                }
              
              
    func_var 
              
                =
              
              
                [
              
              
                (
              
              
                None
              
              
                ,
              
               dict_vars_1
              
                )
              
              
                ,
              
              
                (
              
              
                None
              
              
                ,
              
               dict_vars_2
              
                )
              
              
                ]
              
            
          

将所有要运行多线程的请求扔进线程池:

            
              
                [
              
              pool
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              
                for
              
               req 
              
                in
              
               requests
              
                ]
              
              
                # 等同于
              
              
                for
              
               req 
              
                in
              
               requests
              
                :
              
                
    pool
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              

等待所有的线程完成工作后退出:
pool
              
                .
              
              wait
              
                (
              
              
                )
              
            
          

示例:

            
              
                #!/usr/bin/env python
              
              
                # coding:utf-8
              
              
                import
              
               time

              
                import
              
               random

              
                import
              
               threadpool

HEHE 
              
                =
              
              
                dict
              
              
                (
              
              
                )
              
              
                def
              
              
                sayhello
              
              
                (
              
              name
              
                ,
              
               v
              
                )
              
              
                :
              
              
                global
              
               HEHE
    
              
                if
              
               HEHE
              
                .
              
              has_key
              
                (
              
              name
              
                )
              
              
                :
              
              
        HEHE
              
                [
              
              name
              
                ]
              
              
                =
              
               HEHE
              
                [
              
              name
              
                ]
              
              
                +
              
              
                '+'
              
              
                +
              
               v
    
              
                else
              
              
                :
              
              
        HEHE
              
                [
              
              name
              
                ]
              
              
                =
              
               v
    
              
                #time.sleep(2)
              
              
                #name_list = [(['caoshuai', '1'], None), (['yangliu', '2'], None),(['caoshuai', '3'], None),(['ss', '10'], None),(['wwwwww', '12'], None),]
              
              
name_list 
              
                =
              
              
                [
              
              
                (
              
              
                [
              
              
                'caoshuai'
              
              
                ,
              
              
                '1'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'caoshuai'
              
              
                ,
              
              
                '2'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'a'
              
              
                ,
              
              
                '3'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'ss'
              
              
                ,
              
              
                '10'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'wwwwww'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'm'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'n'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'b'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'v'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'x'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                (
              
              
                [
              
              
                'z'
              
              
                ,
              
              
                '12'
              
              
                ]
              
              
                ,
              
              
                None
              
              
                )
              
              
                ,
              
              
                ]
              
              
                #name_list = [1, -5, 6, -4]
              
              

start_time 
              
                =
              
               time
              
                .
              
              time
              
                (
              
              
                )
              
              

pool_t 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              
                4
              
              
                )
              
              

requestss 
              
                =
              
               threadpool
              
                .
              
              makeRequests
              
                (
              
              sayhello
              
                ,
              
               name_list
              
                )
              
              
                [
              
              pool_t
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              
                for
              
               req 
              
                in
              
               requestss
              
                ]
              
              

pool_t
              
                .
              
              wait
              
                (
              
              
                )
              
              
                print
              
               HEHE

              
                print
              
              
                "%s second"
              
              
                %
              
              
                (
              
              time
              
                .
              
              time
              
                (
              
              
                )
              
              
                -
              
              start_time
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
    time
              
                .
              
              sleep
              
                (
              
              
                1
              
              
                )
              
            
          

回调函数

结果收集用callback参数
callback必须接受2个匿名参数, 按顺序分别是WorkRequest对象和任务函数的结果。
举个栗子

            
              
                def
              
              
                save_callback
              
              
                (
              
              request
              
                ,
              
               result
              
                )
              
              
                :
              
              
                # 第1个参数是request,可以访问request.requestID
              
              
                # 第2个参数是request执行完的结果
              
              
                print
              
              
                (
              
              request
              
                .
              
              requestID
              
                ,
              
               result
              
                )
              
              
                with
              
              
                open
              
              
                (
              
              
                'result.txt'
              
              
                ,
              
              
                'a'
              
              
                )
              
              
                as
              
               f
              
                :
              
              
        f
              
                .
              
              write
              
                (
              
              result 
              
                +
              
              
                '\n'
              
              
                )
              
              
                def
              
              
                get_user_info
              
              
                (
              
              uid
              
                ,
              
               sex
              
                ,
              
               name
              
                ,
              
               age
              
                )
              
              
                :
              
              
    time
              
                .
              
              sleep
              
                (
              
              
                0.3
              
              
                )
              
              
                return
              
              
                "{0},{1},{2},{3}"
              
              
                .
              
              
                format
              
              
                (
              
              uid
              
                ,
              
               sex
              
                ,
              
               name
              
                ,
              
               age
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                '__main__'
              
              
                :
              
              
    num 
              
                =
              
              
                100
              
              
    para_list 
              
                =
              
              
                [
              
              
                [
              
              i
              
                ,
              
              
                'male'
              
              
                ]
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                1
              
              
                ,
              
               num
              
                )
              
              
                ]
              
              
    users 
              
                =
              
              
                list
              
              
                (
              
              
                )
              
              
                for
              
               i 
              
                in
              
              
                range
              
              
                (
              
              
                1
              
              
                ,
              
               num
              
                )
              
              
                :
              
              
        user 
              
                =
              
              
                {
              
              
                'name'
              
              
                .
              
              
                format
              
              
                (
              
              i
              
                )
              
              
                :
              
              
                'user{0}'
              
              
                .
              
              
                format
              
              
                (
              
              i
              
                )
              
              
                ,
              
              
                'age'
              
              
                :
              
               i
              
                }
              
              
        users
              
                .
              
              append
              
                (
              
              user
              
                )
              
              
    params 
              
                =
              
              
                zip
              
              
                (
              
              para_list
              
                ,
              
               users
              
                )
              
              
                # print(params)
              
              
                # 形如[([1, 'male'], {'age': 1, 'name': 'user1'}), ...]的参数列表
              
              

    pool_size 
              
                =
              
              
                10
              
              
    pool 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              pool_size
              
                )
              
              
    requests 
              
                =
              
               threadpool
              
                .
              
              makeRequests
              
                (
              
              get_user_info
              
                ,
              
               params
              
                ,
              
               save_callback
              
                )
              
              
                for
              
               req 
              
                in
              
               requests
              
                :
              
              
    	pool
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              
    pool
              
                .
              
              wait
              
                (
              
              
                )
              
              
    ```

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论