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
              
                (
              
              
                )
              
              
    ```
            
          
        

