ProcessPoolExecutor小用例

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模塊進行,使得在一個異步中阻塞,不致於影響整個主線程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章