【python】ThreadPoolExecutor

ThreadPoolExecutor

例子1:

from concurrent.futures import ThreadPoolExecutor
from time import sleep

def task(message):
   sleep(2)
   return message

def main():
   executor = ThreadPoolExecutor(5)
   future = executor.submit(task, ("Completed"))
   print(future.done())
   sleep(2)
   print(future.done())
   print(future.result())
if __name__ == '__main__':
    main()

输出:

False
True
Completed

 

使用 map 方法,无需提前使用 submit 方法,map 方法与 python 标准库中的 map 含义相同,都是将序列中的每个元素都执行同一个函数,下面的代码就是对 urls 的每个元素都执行 get_html 函数,并分配到线程池里。可以看到执行结果与上面的 as_completed 方法的结果不同,输出顺序和 urls 列表的顺序相同,就算 2s 的任务先执行完成,也会先打印出3s的任务先完成,再打印2s的任务完成。

from concurrent.futures import ThreadPoolExecutor
import time

# 参数times用来模拟网络请求的时间
def get_html(times):
    time.sleep(times)
    print("get page {}s finished".format(times))
    return times

executor = ThreadPoolExecutor(max_workers=2)
urls = [3, 2, 4] # 并不是真的url

for data in executor.map(get_html, urls):
    print("in main: get page {}s success".format(data))

输出:

get page 2s finished
get page 3s finished
in main: get page 3s success
in main: get page 2s success
get page 4s finished
in main: get page 4s success

 

 

参考资料

1. ThreadPoolExecutor线程池

 

posted @ 2023-06-02 15:12  苏格拉底的落泪  阅读(51)  评论(0编辑  收藏  举报