黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python多線程簡(jiǎn)易版 - 線程池THREADPOOL及回調(diào)函數(shù)

系統(tǒng) 1977 0

threadpool

  • makeRequests的原型如下 def makeRequests(callable_, args_list, callback=None, exc_callback=_handle_thread_exception),可以看出第一個(gè)參數(shù)是線程將要啟動(dòng)任務(wù)函數(shù),第二個(gè)是要傳個(gè)任務(wù)函數(shù)的參數(shù)列表,第三個(gè)是回調(diào)函數(shù),可以用于收集任務(wù)結(jié)束后的結(jié)果或者環(huán)境清理
  • args_list 中每一項(xiàng)要么是一個(gè)單獨(dú)的變量,要么是一個(gè)2個(gè)元素的元組,該元組第1項(xiàng)是位置參數(shù)的列表,該元組的第2項(xiàng)是關(guān)鍵參數(shù)的字典(很繞口,但最重要
  • 任務(wù)函數(shù)的多參數(shù),你可以統(tǒng)統(tǒng)通過(guò)位置參數(shù)列表傳進(jìn)去,也可以統(tǒng)統(tǒng)通過(guò)關(guān)鍵字參數(shù)字典傳進(jìn)去,也可以通過(guò)混合方式傳進(jìn)去
  • 例如你的任務(wù)函數(shù)有兩個(gè)參數(shù),一個(gè)是name,一個(gè)是age,那么你可以傳args_list為[([‘python’, 12], None), ]這樣的形式, None是未傳遞的關(guān)鍵字參數(shù)字典。
  • 也可以傳args_list為[(None, {‘name’:‘python’, ‘a(chǎn)ge’: 12}), ]這樣的形式,None是未傳遞的位置參數(shù)列表。
  • 還可以傳args_list為[([‘python’], {‘a(chǎn)ge’: 12}), ]這樣的形式,這就是混合形式
  • 個(gè)人感覺(jué)太靈活了,而且不好理解

以下是簡(jiǎn)單的4行代碼:

            
              pool 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              
                10
              
              
                )
              
              
                #建立線程池,控制線程數(shù)量為10
              
              
reqs 
              
                =
              
               threadpool
              
                .
              
              makeRequests
              
                (
              
              get_title
              
                ,
              
               data
              
                ,
              
               print_result
              
                )
              
              
                #構(gòu)建請(qǐng)求,
              
              
                #get_title為要運(yùn)行的函數(shù),data為要多線程執(zhí)行函數(shù)的參數(shù),
              
              
                #最后這個(gè)print_result是可選的,是對(duì)前兩個(gè)函數(shù)運(yùn)行結(jié)果的操作
              
              
                [
              
              pool
              
                .
              
              putRequest
              
                (
              
              req
              
                )
              
              
                for
              
               req 
              
                in
              
               reqs
              
                ]
              
              
                #多線程一塊執(zhí)行
              
              
pool
              
                .
              
              wait
              
                (
              
              
                )
              
              
                #線程掛起,直到結(jié)束
              
            
          

創(chuàng)建線程池,線程數(shù)為10:

            
              pool 
              
                =
              
               threadpool
              
                .
              
              ThreadPool
              
                (
              
              
                10
              
              
                )
              
            
          

創(chuàng)建線程請(qǐng)求,包涵調(diào)用的函數(shù)、參數(shù)和回調(diào)函數(shù):

            
              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個(gè)元素的元組,第一個(gè)是list,第二個(gè)是dict,如果線程函數(shù)需要多個(gè)參數(shù),需要拼接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
              
                )
              
              
                ]
              
            
          

將所有要運(yùn)行多線程的請(qǐng)求扔進(jìn)線程池:

            
              
                [
              
              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
              
              
                )
              
            
          

回調(diào)函數(shù)

結(jié)果收集用callback參數(shù)
callback必須接受2個(gè)匿名參數(shù), 按順序分別是WorkRequest對(duì)象和任務(wù)函數(shù)的結(jié)果。
舉個(gè)栗子

            
              
                def
              
              
                save_callback
              
              
                (
              
              request
              
                ,
              
               result
              
                )
              
              
                :
              
              
                # 第1個(gè)參數(shù)是request,可以訪問(wèn)request.requestID
              
              
                # 第2個(gè)參數(shù)是request執(zhí)行完的結(jié)果
              
              
                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'}), ...]的參數(shù)列表
              
              

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

            
          

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論