參考文件:
為實現程式併發執行和資源共享,提高程式效率,需要進行多執行緒以及多程序開發。在具體介紹之前,需要了解gil.
gil是實現python直譯器(cpython)時引入的乙個概念,不是python特性。gil是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有當執行緒獲取到全域性直譯器鎖後才能執行,而全域性直譯器鎖只有乙個,因此即使在多核的情況下也只能發揮出單核的功能。另外在做io操作時,gil總是被釋放。因此,io密集型的python比計算密集型的程式更能利用多執行緒環境帶來的便利。這對我們的程式究竟是選擇多執行緒還是多程序大有幫助。
總而言之,使用程序池來執行cpu密集型的任務,這樣可以利用到多核的好處;使用執行緒池來處理io型任務,根據實際情況來調整池的大小(執行緒過多時,切換執行緒的開銷將會嚴重影響效能)。
具有執行緒池和程序池、管理和並行程式設計任務。
由以下部分組成:
executor是抽象類,可以通過子類訪問,即執行緒或程序的concurrent.futures.executor
: 這是乙個虛擬基類,提供了非同步執行的方法。
submit(function, argument)
: 排程函式(可呼叫的物件)的執行,將argument
作為引數傳入。
map(function, argument)
: 將argument
作為引數執行函式,以非同步的方式。
shutdown(wait=true)
: 發出讓執行者釋放所有資源的訊號。
concurrent.futures.future
: 其中包括函式的非同步執行。future物件是submit任務(即帶有引數的functions)到executor的例項。
executorpools
。因為,執行緒或程序的例項是依賴於資源的任務,所以最好以「池」的形式將他們組織在一起,作為可以重用的launcher或executor。
兩種executor子類
concurrent.futures.threadpoolexecutor(max_workers)
concurrent.futures.processpoolexecutor(max_workers)
#max_workers表示最多有個worker並行執行
# 執行緒池執行
start_time_1 = time.time()
with concurrent.futures.threadpoolexecutor(max_workers=5) as executor:
futures = executor.submit(func, argument)
# 程序池
start_time_2 = time.time()
with concurrent.futures.processpoolexecutor(max_workers=5) as executor:
futures = executor.submit(func, argument)
processpoolexecutor使用乙個執行緒池來並行執行任務,但是和threadpoolexecutor 不同的是processpoolexecutor使用多核處理的模組,不受gil限制,可以大大縮短執行時間
若是要將多行pandas dataframe用於並行的話,需要注意
import concurrent.futures
import pandas as pd
def foo(item1,item2):
return 'true'
with concurrent.futures.processpoolexecutor(16) as pool:
df = pd.read_csv("filepath", sep='\t', header=none)
df['status'] = list(pool.map(foo, df['col1'], df['col2'], chunksize=1_000))
pool.map()第乙個引數是函式,第二個引數是迭代器,會將迭代器的資料作為引數依次傳入函式中,從而使資料可以並行操作,而不可以將dataframe作為乙個整體作為要並行執行的函式引數
chunksize=1_000可以使每個process每次執行1000行
執行緒池與程序池
從python3.2開始,標準庫為我們提供了concurrent.futures模組,它提供了threadpoolexecutor和processpoolexecutor兩個類,實現了對threading和multiprocessing的更高階的抽象,是使用非同步實現,充分利用cpu提高程式執行效率...
執行緒池與程序池
為什麼要裝到容器中 可以避免頻繁的建立和銷毀 程序 執行緒 來的資源開銷 可以限制同時存在的執行緒數量 以保證伺服器不會應為資源不足而導致崩潰 幫我們管理了執行緒的生命週期 管理了任務的分配 from concurrent.futures import threadpoolexecutor,proc...
執行緒池與程序池
from concurrent.futures import processpoolexecutor p processpoolexecutor 5 deftask n print n if name main for i in range 10 p.submit task,i submit 提交任...