python 執行緒池與程序池

2021-08-28 06:23:58 字數 2267 閱讀 8855

參考文件: 

為實現程式併發執行和資源共享,提高程式效率,需要進行多執行緒以及多程序開發。在具體介紹之前,需要了解gil.

gil是實現python直譯器(cpython)時引入的乙個概念,不是python特性。gil是全域性直譯器鎖,可以控制同一時刻只有乙個執行緒能夠執行,這樣在跑多執行緒的情況下,只有當執行緒獲取到全域性直譯器鎖後才能執行,而全域性直譯器鎖只有乙個,因此即使在多核的情況下也只能發揮出單核的功能。另外在做io操作時,gil總是被釋放。因此,io密集型的python比計算密集型的程式更能利用多執行緒環境帶來的便利。這對我們的程式究竟是選擇多執行緒還是多程序大有幫助。

總而言之,使用程序池來執行cpu密集型的任務,這樣可以利用到多核的好處;使用執行緒池來處理io型任務,根據實際情況來調整池的大小(執行緒過多時,切換執行緒的開銷將會嚴重影響效能)。

具有執行緒池和程序池、管理和並行程式設計任務。

由以下部分組成:

concurrent.futures.executor: 這是乙個虛擬基類,提供了非同步執行的方法。

submit(function, argument): 排程函式(可呼叫的物件)的執行,將argument作為引數傳入。

map(function, argument): 將argument作為引數執行函式,以非同步的方式。

shutdown(wait=true): 發出讓執行者釋放所有資源的訊號。

concurrent.futures.future: 其中包括函式的非同步執行。future物件是submit任務(即帶有引數的functions)到executor的例項。

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 提交任...