首頁  >  文章  >  後端開發  >  python之怎麼使用執行緒池map()方法傳遞多參數list

python之怎麼使用執行緒池map()方法傳遞多參數list

WBOY
WBOY轉載
2023-04-29 16:25:071616瀏覽

線程池map()方法傳遞多參數list

之前透過threading.thread()進行了助力介面的多執行緒並發,但是這個針對並發數量較少的時候比較好用,如果並發數量多,除了線程包協程這種處理方式的情況下,我們還可以採用線程池的方法。

線程池的實作通俗講就是把所有的任務放在了訊息佇列裡,開啟多個執行緒後執行線程,但執行緒執行結束後不會中斷執行緒任務,會從訊息佇列內繼續取得執行緒任務進行執行緒執行,這樣執行緒池就比多執行緒操作節省了許多創建執行緒與關閉執行緒的步驟,節約大部分資源與時間。

執行緒池並發需要引入模組

import concurrent.futures

ThreadPoolExecutor 內有兩種執行緒池方法map()與submit()今天先說map()方法

#他的語法為

 with concurrent.futures.ThreadPoolExecutor() as pool:
      res = pool.map(craw, uid_list)
      print(res)
  • map()內craw為方法名,這裡方法命不帶()

  • uid_list為方法參數,map()方法內需要傳遞list資料型別

#先看整體程式碼

##5000用戶並發助力

    def test_case_09(self):
        """5000用户并发助力"""
        # 通过yaml配置文件封装方法 获取uid_list
        uid_list = YamlHandler(YamlThePath().number_new).get_uid_list()
        # add_ticket获取5000账号登陆状态
        with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(AccountAccess().add_ticket, uid_list)
        # 5000账号线程池方法助力用户
        with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(PreheatMethod().help, [(uid, self.A, 1) for uid in uid_list])
        # 获取用户被助力次数
        response = PreheatMethod().init(self.A)
        print(f"当前用户被助力次数 :{response['data']['userInfo']['helpedCount']}次")

再來看兩個介面的方法更好的感知一下

首先是取得登陸狀態add_ticket

    def add_ticket(self, uid):
        """
        获取单独用户t票
        :param uid: 单独用户uid
        :return:
        """
        self.data['url'] = ApiAddress().get_ticket
        self.data['host'] = ApiAddress().host
        self.params['uid'] = str(uid)
        self.params['type'] = 0
        self.data['params'] = json.dumps(self.params)
        res = r().post(url=ApiAddress().ticket, data=self.data)
        print(f'获取t票结果:{uid}{res}')
        return uid

很簡單的一個介面請求入參只有一個uid,但是注意一下這裡的uid不是list,他只是一個參數。

那麼有的同學就會有疑問,map()內傳遞的方法參數就是一個uid內容的list。

map()方法就是把你需要的參數存在list內,透過遍歷的方式去請求你指定的介面。

這時候可能有的人又會問,因為我當時也是這麼問自己的,如果一個方法內有多個參數,其中這些參數有的甚至都不是固定的內容怎麼辦。

咱們看一下另一個請求助力介面的方法

    def help(self, agrs):
        """
        助力用户
        :param agrs: uid:当前用户uid to_uid:助力用户uid count:助力次数
        :return:
        """
        uid, to_uid, count = agrs
        self.attrs['toUid'] = str(to_uid)
        self.attrs['count'] = count
        response = r().response(uid, self.code, "help", **self.attrs)
        logger.info(f'help response uid:{uid} to_uid:{to_uid}\n{response}')
        return response

沒錯,我們透過元組的方式傳遞到助力介面內,透過元組內的關鍵字位置分別給指定的元素賦值。

再線程池的程式碼內,我們透過列表推導式把uid_list內的參數便利到你指定好的元組內,當然這裡如果是多個參數,也可以用字典,把字典便利key與value當作變化的參數,因為列表推導式給你回傳的是list,所以我們把需要的參數放在元組內,元組放在列表內,這樣就可以對多參數的方法使用map()線程池進行並發了。

with concurrent.futures.ThreadPoolExecutor() as pool:
            pool.map(PreheatMethod().help, [(uid, self.A, 1) for uid in uid_list])
[(uid, self.A, 1) for uid in uid_list]

列表推導式取得後大概就是下方的list資料內容格式

python之怎麼使用執行緒池map()方法傳遞多參數list

以上是python之怎麼使用執行緒池map()方法傳遞多參數list的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除