執行緒池與程序池

2021-08-22 00:17:39 字數 3008 閱讀 3496

從python3.2開始,標準庫為我們提供了concurrent.futures模組,它提供了threadpoolexecutorprocesspoolexecutor兩個類,實現了對threadingmultiprocessing的更高階的抽象,是使用非同步實現,充分利用cpu提高程式執行效率,對編寫執行緒池/程序池提供了直接的支援,而傳統的程序池/執行緒池是使用阻塞式實現的;python2.7版本可以安裝futures模組,使用方式和python3一樣。

其中:concurrent.futures基礎模組是executor和future

threadpoolexecutor:適用於io密集型任務,受gil影響,還是只能利用單核cpu資源

processpoolexecutor:適用於計算密集型,可以充分利用多核cup,會以子程序的形式,平行的執行多個直譯器,子程序與主解釋相分離,每個子程序都可以完整的利用乙個cpu核心,實現真正的平行計算;但是多程序會增大系統開銷,主程序和子程序之間進行通訊必須進行序列化和反序列化操作

呼叫執行緒池的簡化**:

from concurrent.futures import wait, all_completed, threadpoolexecutor, as_completed

# as_completed返回乙個執行狀態的迭代器

with threadpoolexecutor(max_workers=workers) as executor:

# executor.submit提交到任務列表,並返回乙個可呼叫執行的future

future_do_job =

# wait等待所有任務都執行完畢才返回,return_when控制返回狀態,timeout控制最大等待時間

for future in as_completed(future_do_job, timeout=600):

try:

# future.done判斷任務是否執行結束

if future.done():

# future.result獲取任務執行的返回結果

sub_domains = future.result()

print('{}: {}'.format(future_do_job[future], sub_domains))

if len(sub_domains) > 0:

all_subdns.extend(sub_domains)

except exception as e:

print(e)

future.cancel()

# wait返回兩個set列表,分別為已經完成的和未完成的

with threadpoolexecutor(max_workers=workers) as executor:

# executor.submit提交到任務列表,並返回乙個可呼叫執行的future

future_do_job =

# wait等待所有任務都執行完畢才返回,return_when控制返回狀態,timeout控制最大等待時間

done_futures, not_done_futures = wait(future_do_job, timeout=600, return_when=all_completed)

for future in done_futures:

domain = future_do_job[future]

try:

ips = future.result()

print('{}: {}'.format(domain, ''.join(ips)))

for ip in ips:

ip_rele_domains[ip].add(domain)

except exception as e:

print('{} dns resolve failed, exception is {}'.format(domain, str(e)))

future.cancel()

for future in not_done_futures:

domain = future_do_job[future]

print('{} dns resolve failed'.format(domain))

future.cancel()

""" 非同步執行緒池可以直接獲得函式返回結果 """

from concurrent.futures import threadpoolexecutor

import time

def return_future_result(message):

time.sleep(2)

return message

pool = threadpoolexecutor(max_workers=2) # 建立乙個最大可容納2個task的執行緒池

future1 = pool.submit(return_future_result, ("hello")) # 往執行緒池裡面加入乙個task

future2 = pool.submit(return_future_result, ("world")) # 往執行緒池裡面加入乙個task

print(future1.done()) # 判斷task1是否結束

time.sleep(3)

print(future2.done()) # 判斷task2是否結束

print(future1.result()) # 檢視task1返回的結果

print(future2.result()) # 檢視task2返回的結果

threading 多執行緒控制和處理

python如何充分利用多核cpu

執行緒池和程序池的使用方式類似,只需將thread換成process

執行緒池與程序池

為什麼要裝到容器中 可以避免頻繁的建立和銷毀 程序 執行緒 來的資源開銷 可以限制同時存在的執行緒數量 以保證伺服器不會應為資源不足而導致崩潰 幫我們管理了執行緒的生命週期 管理了任務的分配 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 提交任...

程序池與執行緒池

1.什麼是池?在保證計算機硬體安全的情況下最大限度的利用計算機,池其實是降低了程式的執行效率,但是保證了計算機的硬體安全,不會造成計算機崩掉,伺服器掛掉,受限於硬體的發展才有了池的概念,其實都是保證硬體的安全 2.執行緒池與程序池 執行緒池也就意味著乙個池子,裡面事先已經放好了執行緒,假如裡面有十個...