python之線程池map()方法傳遞多參數(shù)list
線程池map()方法傳遞多參數(shù)list
之前通過(guò)threading.thread()進(jìn)行了助力接口的多線程并發(fā),但是這個(gè)針對(duì)并發(fā)數(shù)量較少的時(shí)候比較好用,如果并發(fā)數(shù)量多,除了線程包協(xié)程這種處理方式的情況下,我們還可以采用線程池的方法。
線程池的實(shí)現(xiàn)通俗講就是把所有的任務(wù)放在了消息隊(duì)列里,開啟多個(gè)線程后執(zhí)行線程,但線程執(zhí)行結(jié)束后不會(huì)中斷線程任務(wù),會(huì)從消息隊(duì)列內(nèi)繼續(xù)獲取線程任務(wù)進(jìn)行線程執(zhí)行,這樣線程池就比多線程操作節(jié)省了很多創(chuàng)建線程與關(guān)閉線程的步驟,節(jié)約大部分資源與時(shí)間。
線程池并發(fā)需要引入模塊
import concurrent.futures
ThreadPoolExecutor 內(nèi)有兩種線程池方法 map()與submit()今天先說(shuō)map()方法
他的語(yǔ)法為
with concurrent.futures.ThreadPoolExecutor() as pool: res = pool.map(craw, uid_list) print(res)
map()
內(nèi)craw為方法名,這里方法命不帶()uid_list
為方法參數(shù),map()方法內(nèi)需要傳遞list數(shù)據(jù)類型
先看一下整體代碼
5000用戶并發(fā)助力
def test_case_09(self): """5000用戶并發(fā)助力""" # 通過(guò)yaml配置文件封裝方法 獲取uid_list uid_list = YamlHandler(YamlThePath().number_new).get_uid_list() # add_ticket獲取5000賬號(hào)登陸狀態(tài) with concurrent.futures.ThreadPoolExecutor() as pool: pool.map(AccountAccess().add_ticket, uid_list) # 5000賬號(hào)線程池方法助力用戶 with concurrent.futures.ThreadPoolExecutor() as pool: pool.map(PreheatMethod().help, [(uid, self.A, 1) for uid in uid_list]) # 獲取用戶被助力次數(shù) response = PreheatMethod().init(self.A) print(f"當(dāng)前用戶被助力次數(shù) :{response['data']['userInfo']['helpedCount']}次")
再來(lái)看一下兩個(gè)接口的方法更好的感知一下
首先是獲取登陸狀態(tài)add_ticket
def add_ticket(self, uid): """ 獲取單獨(dú)用戶t票 :param uid: 單獨(dú)用戶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票結(jié)果:{uid}{res}') return uid
很簡(jiǎn)單的一個(gè)接口請(qǐng)求 入?yún)⒅挥幸粋€(gè)uid,但是注意一下這里的uid不是list,他只是一個(gè)參數(shù)。
那么有的同學(xué)就會(huì)有疑問(wèn),map()內(nèi)傳遞的方法參數(shù)是一個(gè)uid內(nèi)容的list。
map()方法就是把你需要的參數(shù)存在list內(nèi),通過(guò)遍歷的方式去請(qǐng)求你指定的接口。
這時(shí)候可能有的人又會(huì)問(wèn),因?yàn)槲耶?dāng)時(shí)也是這么問(wèn)自己的,如果一個(gè)方法內(nèi)有多個(gè)參數(shù),其中這些參數(shù)有的甚至都不是固定的內(nèi)容怎么辦。
咱們看一下另一個(gè)請(qǐng)求助力接口的方法
def help(self, agrs): """ 助力用戶 :param agrs: uid:當(dāng)前用戶uid to_uid:助力用戶uid count:助力次數(shù) :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
沒錯(cuò),我們通過(guò)元組的方式傳遞到助力接口內(nèi),通過(guò)元組內(nèi)的關(guān)鍵字位置分別給指定的元素賦值。
再線程池的代碼內(nèi),我們通過(guò)列表推導(dǎo)式把uid_list內(nèi)的參數(shù)便利到你指定好的元組內(nèi),當(dāng)然這里如果是多個(gè)參數(shù),也可以用字典,把字典便利key與value當(dāng)作變化的參數(shù),因?yàn)榱斜硗茖?dǎo)式給你返回的是list,所以我們把需要的參數(shù)放在元組內(nèi),元組放在列表內(nèi),這樣就可以對(duì)多參數(shù)的方法使用map()線程池進(jìn)行并發(fā)了。
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]
列表推導(dǎo)式獲取后大概就是下方的list數(shù)據(jù)內(nèi)容格式
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
keras 獲取某層輸出 獲取復(fù)用層的多次輸出實(shí)例
這篇文章主要介紹了keras 獲取某層輸出 獲取復(fù)用層的多次輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python進(jìn)行Socket接口測(cè)試的實(shí)現(xiàn)
Python 提供了強(qiáng)大且易于使用的 socket 模塊,使開發(fā)者能夠輕松地創(chuàng)建客戶端和服務(wù)器應(yīng)用,實(shí)現(xiàn)數(shù)據(jù)傳輸和交互,本文主要介紹了Python進(jìn)行Socket接口測(cè)試的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06python 從遠(yuǎn)程服務(wù)器下載日志文件的程序
本文提供了一種方法,該程序可實(shí)現(xiàn)抓取服務(wù)器的日志文件到本地,根據(jù)該程序可自行擴(kuò)展對(duì)日志文件的自動(dòng)化分析。常用于數(shù)據(jù)挖掘、生產(chǎn)維護(hù)等2013-02-02TensorFlow Autodiff自動(dòng)微分詳解
這篇文章主要介紹了TensorFlow Autodiff自動(dòng)微分詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Anaconda+vscode+pytorch環(huán)境搭建過(guò)程詳解
這篇文章主要介紹了Anaconda+vscode+pytorch環(huán)境搭建過(guò)程詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05