Pythonのスレッドプールの使用ThreadPoolExecutor

基本的な使い方## 1.スレッドプール

# coding: utf-8
from concurrent.futures import ThreadPoolExecutor
import time


def spider(page):
    time.sleep(page)
    print(f"crawl task{page} finished")
    return page

with ThreadPoolExecutor(max_workers=5) as t:  # 创建一个最大容纳数量为5的线程池
    task1 = t.submit(spider, 1)
    task2 = t.submit(spider, 2)  # 通过submit提交执行的函数到线程池中
    task3 = t.submit(spider, 3)

    print(f"task1: {task1.done()}")  # 通过done来判断线程是否完成
    print(f"task2: {task2.done()}")
    print(f"task3: {task3.done()}")

    time.sleep(2.5)
    print(f"task1: {task1.done()}")
    print(f"task2: {task2.done()}")
    print(f"task3: {task3.done()}")
    print(task1.result())  # 通过result来获取返回值

executor = ThreadPoolExecutor(max_workers=5)
all_task = [executor.submit(send_data,"a" ) for i in range(1,2)]
'''
上面的代码等价于下面的:
all_task = []
for i in range(1,2):
    task = executor.submit(send_data,"b" )  # "b"是给 方法send_data 传参,如果send_data有多个参数, executor.submit(send_data,"b","c","d" )
    all_task.append(task)

'''


for future in as_completed(all_task):
    print("finish the task")
    obj_data = future.result()
    print("obj_data is ", obj_data)

def send_data(a):
    print("a is ", a)

as_completed:上記タスクの終了かどうかを決定するための方法を提供するが、メインスレッドでああ判定されたものではないが。最良の方法は、タスクが終わったとき、メインスレッドの戻り結果を与えるが、常に各タスクが完了した判断ではありません。そのような方法の一つであり、場合子スレッドタスクの実装後に()でThreadPoolExecutorThreadPoolExecutorをas_completed、直接結果()は、結果を返します

参考:

待機、マップの利用には、以下のリンクを参照することができます:https://www.jianshu.com/p/6d6e4f745c27

おすすめ

転載: www.cnblogs.com/wanthune/p/11960006.html