引言
Python標(biāo)準(zhǔn)庫為我們提供了threading和multiprocessing模塊編寫相應(yīng)的多線程/多線程代碼,但是當(dāng)項目達(dá)到一定的規(guī)模,頻繁創(chuàng)建/銷毀進(jìn)程或者線程是非常消耗資源的,這個時候我們就要編寫自己的線程池/進(jìn)程池,以空間換時間。但從Python3.2開始,標(biāo)準(zhǔn)庫為我們提供了 concurrent.futures 模塊,它提供了ThreadPoolExecutor和ProcessPoolExecutor兩個類,實現(xiàn)了對threading和multiprocessing的進(jìn)一步抽象,對編寫線程池/進(jìn)程池提供了直接的支持。
Executor和Future
concurrent.futures模塊的基礎(chǔ)是 Exectuor ,Executor是一個抽象類,它不能被直接使用。但是它提供的兩個子類ThreadPoolExecutor和ProcessPoolExecutor卻是非常有用,顧名思義兩者分別被用來創(chuàng)建線程池和進(jìn)程池的代碼。我們可以將相應(yīng)的tasks直接放入線程池/進(jìn)程池,不需要維護(hù)Queue來操心死鎖的問題,線程池/進(jìn)程池會自動幫我們調(diào)度。
Future這個概念相信有java和nodejs下編程經(jīng)驗的朋友肯定不陌生了, 你可以把它理解為一個在未來完成的操作 ,這是異步編程的基礎(chǔ),傳統(tǒng)編程模式下比如我們操作queue.get的時候,在等待返回結(jié)果之前會產(chǎn)生阻塞,cpu不能讓出來做其他事情,而Future的引入幫助我們在等待的這段時間可以完成其他的操作。關(guān)于在Python中進(jìn)行異步IO可以閱讀完本文之后參考我的 Python并發(fā)編程之協(xié)程/異步IO 。
p.s: 如果你依然在堅守Python2.x,請先安裝futures模塊。
pip install futures
使用submit來操作線程池/進(jìn)程池
我們先通過下面這段代碼來了解一下線程池的概念