python之ThreadPoolExecutor

在前面的博客中介紹了線程的用法稚叹,每次使用都要創(chuàng)建線程帐我,啟動線程符糊,有沒有什么辦法簡單操作呢。

python3.2引入的concurrent.future模塊中有ThreadPoolExecutor和ProcessPoolExecutor兩個類甘改,這兩個類內(nèi)部維護著線程/進程池旅东,以及要執(zhí)行的任務(wù)隊列,使得操作變得非常簡單十艾,不需要關(guān)心任何實現(xiàn)細節(jié)

來看一個簡單的例子

#!/usr/bin/env python3.6
from concurrent.futures import ThreadPoolExecutor
import requests
import os

DEST_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "download")
BASE_URL = "http://flupy.org/data/flags"
CC_LIST = ("CN", "US", "JP", "EG")

if not os.path.exists(DEST_DIR):
    os.mkdir(DEST_DIR)


def get_img(cc):
    url = "{}/{cc}/{cc}.gif".format(BASE_URL, cc=cc.lower())
    response = requests.get(url)
    return response.content

def save_img(img, filename):
    path = os.path.join(DEST_DIR, filename)
    with open(path, 'wb') as f:
        f.write(img)

def download_one(cc):
    img = get_img(cc)
    save_img(img, cc.lower() + ".gif")
    return cc

def download_many(cc_list):
    works = len(cc_list)
    with ThreadPoolExecutor(works) as exector: # 使用with來管理ThreadPoolExecutor
  # map方法和內(nèi)置的map方法類似抵代,不過exector的map方法會并發(fā)調(diào)用,返回一個由返回的值構(gòu)成的生成器
        response = exector.map(download_one, cc_list)
    return len(list(response))

if __name__ == "__main__":
    download_many(CC_LIST)

Future

concurrent.futures和asyncio中的Future類的作用相同忘嫉,****都表示可能己經(jīng)完成或尚未完成的延遲計算****

Future封裝待完成的操作荤牍,可以放入隊列案腺,完成的狀態(tài)可以查詢,得到結(jié)果后可以獲取結(jié)果

使用exector.submit()方法提交執(zhí)行的函數(shù)并獲取一個Future康吵,而不是直接創(chuàng)建劈榨,傳入的參數(shù)是一個可調(diào)用的對象;獲取的Future對象有一個done()方法,判斷該Future是否己完成晦嵌, add_one_callback()設(shè)置回調(diào)函數(shù), result()來獲取Future的結(jié)果同辣。as_completed()傳一個Future列表,在Future都完成之后返回一個迭代器

使用submit()方法試試看

def download_many(cc_list):
    with ThreadPoolExecutor(max_workers=5) as exector:
        future_list = []
        for cc in cc_list:
    # 使用submit提交執(zhí)行的函數(shù)到線程池中耍铜,并返回futer對象(非阻塞)
            future = exector.submit(download_one, cc)
            future_list.append(future)
            print(cc, future)

        result = []
    # as_completed方法傳入一個Future迭代器邑闺,然后在Future對象運行結(jié)束之后yield Future
        for future in futures.as_completed(future_list):
    # 通過result()方法獲取結(jié)果
            res = future.result()
            print(res, future)
            result.append(res)
    return len(result)
  
>>>
CN <Future at 0x7f80d32f5400 state=running>
US <Future at 0x7f80d330c320 state=running>
JP <Future at 0x7f80d330c8d0 state=running>
EG <Future at 0x7f80d330ce10 state=running>
JP <Future at 0x7f80d330c8d0 state=finished returned str>
CN <Future at 0x7f80d32f5400 state=finished returned str>
EG <Future at 0x7f80d330ce10 state=finished returned str>
US <Future at 0x7f80d330c320 state=finished returned str>

ProcessPoolExecutor的使用方法是一樣的跌前,唯一需要注意的區(qū)別是傳入的max_workers這個參數(shù)對于ProcessPoolExecutor是可選的棕兼,在不使用的情況下默認值是os.cpu_count()的返回值(cpu的數(shù)量)

exector.submit()和futures.as_completed()這個組合比exector.map()更靈活,submit()可以處理不同的調(diào)用函數(shù)和參數(shù)抵乓,而map只能處理同一個可調(diào)用對象伴挚。

wait()阻塞主線程,直到所有task都完成灾炭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茎芋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜈出,更是在濱河造成了極大的恐慌田弥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铡原,死亡現(xiàn)場離奇詭異偷厦,居然都是意外死亡,警方通過查閱死者的電腦和手機燕刻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門只泼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卵洗,你說我怎么就攤上這事请唱。” “怎么了过蹂?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵十绑,是天一觀的道長。 經(jīng)常有香客問我酷勺,道長本橙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任鸥印,我火速辦了婚禮勋功,結(jié)果婚禮上坦报,老公的妹妹穿的比我還像新娘。我一直安慰自己狂鞋,他們只是感情好片择,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骚揍,像睡著了一般字管。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信不,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天嘲叔,我揣著相機與錄音,去河邊找鬼抽活。 笑死硫戈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的下硕。 我是一名探鬼主播丁逝,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梭姓!你這毒婦竟也來了霜幼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤誉尖,失蹤者是張志新(化名)和其女友劉穎罪既,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铡恕,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡琢感,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了没咙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猩谊。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祭刚,靈堂內(nèi)的尸體忽然破棺而出牌捷,到底是詐尸還是另有隱情,我是刑警寧澤涡驮,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布暗甥,位于F島的核電站,受9級特大地震影響捉捅,放射性物質(zhì)發(fā)生泄漏撤防。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一棒口、第九天 我趴在偏房一處隱蔽的房頂上張望寄月。 院中可真熱鬧辜膝,春花似錦、人聲如沸漾肮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽克懊。三九已至忱辅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谭溉,已是汗流浹背墙懂。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扮念,地道東北人损搬。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像扔亥,于是被迫代替她去往敵國和親场躯。 傳聞我的和親對象是個殘疾皇子谈为,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容