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() 就是這樣一個方法,當子線程中的任務執行完后,直接用 result() 獲取返回結果

參考:

wait ,map的用法可以參考下面的鏈接:
https://www.jianshu.com/p/6d6e4f745c27


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM