從python3.2開始,標準庫為我們提供了concurrent.futures
模組,它提供了threadpoolexecutor
和processpoolexecutor
兩個類,實現了對threading
和multiprocessing
的更高階的抽象,是使用非同步實現,充分利用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.執行緒池與程序池 執行緒池也就意味著乙個池子,裡面事先已經放好了執行緒,假如裡面有十個...