1. 程式人生 > >python多執行緒————7、ThreadPoolExecutor執行緒池

python多執行緒————7、ThreadPoolExecutor執行緒池

所用到的模組:from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED

1、建立執行緒池:executor = ThreadPoolExecutor(max_workers= )

2、提交執行函式到執行緒池:task = executor.submit(func,(args))

3、獲取執行結果:task.result()

4、判斷執行緒是否完成:task.done()

5、取消還沒執行的執行緒:task.cancel()

6、利用as_completed獲取執行緒完成結果

all_task = [executor.submit(get_html,(url)) for url in urls]
for future in as_completed(all_task):
    data = future.result()
    print("get page {}".format(data))

7、通過executor的map獲取已經完成的task值

for data in executor.map(get_html,urls):

    print(data)

8、使用wait()方法阻塞執行緒

 

全篇程式碼如下

from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED
#執行緒池,為什麼要執行緒池
#主執行緒中可以獲取一個執行緒的狀態或者某一個任務的狀態,以及返回值
#當一個執行緒完成的時候我們主執行緒能立即知道
#futures可以讓多執行緒和多程序編碼介面一致
import time
def get_html(times):
    time.sleep(times)
    print("get page {} success".format(times))
    return times

executor = ThreadPoolExecutor(max_workers=2)
#通過submit函式提交執行的函式到執行緒池中,submit是立即返回
# task1 = executor.submit(get_html,(5))
# task2 = executor.submit(get_html,(4))
# task3 = executor.submit(get_html,(1))
# time.sleep(6)
urls = [4,2,3]
all_task = [executor.submit(get_html,(url)) for url in urls]
wait(all_task,return_when=FIRST_COMPLETED)
for future in as_completed(all_task):
    data = future.result()
    print("get page {}".format(data))

#通過executor的map獲取已經完成的task的值
# for data in executor.map(get_html,urls):
#     print("get page {}".format(data))
#
# #通過result方法可以獲取task的執行結果
# print(task1.result())
# #通過done方法判斷執行緒是否完成
# print(task1.done())
# #通過cancel方法取消還沒執行的執行緒
# print(task3.cancel())