版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本文首發(fā)地址:http://jackeygao.com/post/python-concurrent2
一般程序并發(fā)分為多線程
和多進(jìn)程
并發(fā).
那么什么時(shí)候選擇兩種并發(fā)手段贸辈, 該如何選擇呢灼捂, 應(yīng)用場(chǎng)景是什么传蹈?
根據(jù)編程邏輯一般需要計(jì)算密集和I/O操作密集的時(shí)候選擇并發(fā)提高程序效率鞭莽, Python 由于GIL的限制枉疼,密集性運(yùn)算需要使用多核心CPU時(shí)候旭贬, 這時(shí)候多線程顯得力不從心呛梆, 甚至?xí)兊酶6?dāng)需要I/O操作犬辰, 比如HTTP長(zhǎng)連接的時(shí)候嗦篱, 耗費(fèi)的時(shí)間只是TCP建立鏈接的等待時(shí)間, 這時(shí)候當(dāng)然優(yōu)先使用多線程幌缝。
所以一般情況下灸促, 我們開發(fā)程序耗費(fèi)比較慢的是計(jì)算密集
和I/O密集
兩種情況下的邏輯, 那么我可以采群选:
- 計(jì)算密集:多進(jìn)程
- I/O密集:多線程
推薦使用庫:
concurrent.futures 是python3新增加的一個(gè)庫浴栽,用于并發(fā)處理,類似于其他語言里的線程池(也有一個(gè)進(jìn)程池)轿偎,他屬于上層的封裝典鸡,對(duì)于用戶來說,不用在考慮那么多東西了, 現(xiàn)已加入python 3.2標(biāo)準(zhǔn)庫贴硫, python 2.7需要安裝一下椿每。
pip install futures
Executor:兩個(gè)子ThreadPoolExecutor
和ProcessPoolExecutor
分別是產(chǎn)生進(jìn)程池和線程池
Future:有Executor.submit產(chǎn)生多任務(wù)
ThreadPoolExecutor 和 ProcessPoolExecutor直接python的with as 控制流語句伊者, 讓你非常簡(jiǎn)單的就套入了程序里面英遭。