日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python多線程簡易版 - 線程池THREADPOOL及回調函數

系統 1725 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條評論
主站蜘蛛池模板: 玛沁县| 尼玛县| 朝阳县| 晋中市| 福贡县| 阿尔山市| 民勤县| 汝阳县| 金寨县| 铅山县| 阜宁县| 安化县| 射洪县| 商洛市| 怀柔区| 镇雄县| 桐庐县| 乐都县| 电白县| 永康市| 沐川县| 斗六市| 隆回县| 日喀则市| 枣庄市| 乐山市| 尤溪县| 舒城县| 丰顺县| 怀仁县| 普宁市| 丘北县| 内黄县| 马鞍山市| 通许县| 霍城县| 昌乐县| 湟中县| 河西区| 霍邱县| 井研县|