1. 程式人生 > 實用技巧 >併發程式設計之執行緒池與程序池

併發程式設計之執行緒池與程序池

Python標準模組--concurrent.futures

基本介紹

#1 介紹
concurrent.futures模組提供了高度封裝的非同步呼叫介面
ThreadPoolExecutor:執行緒池,提供非同步呼叫
ProcessPoolExecutor: 程序池,提供非同步呼叫
Both implement the same interface, which is defined by the abstract Executor class.

#2 基本方法
#submit(fn, *args, **kwargs)
非同步提交任務

#map(func, *iterables, timeout=None, chunksize=1) 
取代for迴圈submit的操作 #shutdown(wait=True) 相當於程序池的pool.close()+pool.join()操作 wait=True,等待池內所有任務執行完畢回收完資源後才繼續 wait=False,立即返回,並不會等待池內的任務執行完畢 但不管wait引數為何值,整個程式都會等到所有任務執行完畢 submit和map必須在shutdown之前 #result(timeout=None) 取得結果 #add_done_callback(fn) 回撥函式# done()判斷某一個執行緒是否完成# cancle()取消某個任務

ThreadPoolExecutor的使用

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os

# 括號內, 可以傳數字, 不傳的話預設會開設當前計算機cpu個數5倍的執行緒
pool = ThreadPoolExecutor(5)  # 池子裡面固定只有五個執行緒
"""
執行緒池造出來之後, 裡面會固定存在五個執行緒, 這五個執行緒不會出現重複建立和銷燬的過程
"""
"""
池子的使用非常簡單:
    你只需要將需要做的任務往池子中提交即可, 自動會有人來服務你
"""


def task(n):
    
print(n) print(os.getpid()) time.sleep(2) return n * 2""" 任務的提交方式: 同步: 提交任務之後原地等待任務的返回結果, 期間不做任何事 非同步: 提交任務之後不等待任務的返回結果, 繼續往下執行 """ t_list = [] # pool.submit(task, 1) # 向池子中提交任務 非同步提交 for i in range(20): # 朝池子中提交20個任務 res = pool.submit(task, i) # print(res.result()) """ res.result() 程式由併發變成了序列, 任務為什麼列印的是None, res.result()拿到的是非同步提交的任務的返回結果 """ t_list.append(res) # 等待執行緒池中所有的任務執行完畢之後再進行往下執行 pool.shutdown() # 關閉執行緒池, 等待執行緒池中所有的任務執行完畢 for t in t_list: print('>>>:', t.result()) """ 非同步任務的返回結果應該通過回撥機制來操作 """

ProcessPoolExecutor的使用

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os

# 括號內, 可以傳數字, 不傳的話預設會開設當前計算機cpu個數5倍的執行緒
# pool = ThreadPoolExecutor(5)  # 池子裡面固定只有五個執行緒
pool = ProcessPoolExecutor(5)
"""
執行緒池造出來之後, 裡面會固定存在五個執行緒, 這五個執行緒不會出現重複建立和銷燬的過程
"""
"""
池子的使用非常簡單:
    你只需要將需要做的任務往池子中提交即可, 自動會有人來服務你
"""


def task(n):
    print(n)
    print(os.getpid())
    time.sleep(2)

    return n * 2

def call_back(n):
    print('call_back',n.result)

"""
任務的提交方式:
    同步: 提交任務之後原地等待任務的返回結果, 期間不做任何事
    非同步: 提交任務之後不等待任務的返回結果, 繼續往下執行
"""
t_list = []
# pool.submit(task, 1)  # 向池子中提交任務  非同步提交
for i in range(20):  # 朝池子中提交20個任務
    res = pool.submit(task, i).add_done_callback(call_back)
    # print(res.result())
    """
    res.result()
    程式由併發變成了序列,
    任務為什麼列印的是None,
    res.result()拿到的是非同步提交的任務的返回結果
    """
    t_list.append(res)

# 等待執行緒池中所有的任務執行完畢之後再進行往下執行
pool.shutdown()  # 關閉執行緒池, 等待執行緒池中所有的任務執行完畢

for t in t_list:
    print('>>>:', t.result())

"""
非同步任務的返回結果應該通過回撥機制來操作
"""