ProcessPoolExecutor用起來很簡單,完全可以當成一個小模塊使用,使用時通過submit函數註冊需要調用的work函數,然後通過add_done_callback註冊需要回調結果的函數when_done即可,當work被進程執行完成後,結果會通過回調when_done返回
demo代碼如下:
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
processpool的小用例
"""
from concurrent.futures import ProcessPoolExecutor
import time
def when_done(r):
for x in r.result():
print("Got", x)
def work(x):
time.sleep(3)
a = set()
a.add(x)
return a
def run_one_process():
with ProcessPoolExecutor() as pool:
future_result = pool.submit(work, "ccc")
future_result.add_done_callback(when_done)
print("with end.")
print("run one end.")
if __name__ == '__main__':
run_one_process()
print("main end.")
結果如下:
with end.
Got b
Got a
Got ccc
run one end.
main end.
可以看出在沒有退出with之前,進程尚未啓動,退出with後進程啓動並阻塞,看到進程結束回調完成,然後運行print(“run one end.”)
此種場景針對那種需要併發執行,儘可能利用cpu很有用處。要知道python的線程很難利用多核的優勢。
實際使用在大型項目中,由於with一退出就會阻塞到執行結束,所以一般需要配合apscheduler模塊進行,使得在一個異步中阻塞,不致於影響整個主線程