线程池concurrent.futures

from concurrent.futures import ThreadPoolExecutor,as_completed,wait
import time

# 线程池
# 主线程中可以获取某一个线程的状态或某一个任务的状态 以及返回值
# 当一个线程完成的时候我们主线程能立即知道
# futures 可以让多线程和多进程编码接口一致




# 定义一个模拟网络请求
def get_html(times):

    time.sleep(times)
    print("get page {} success".format(times))
    return times


# 定义一个线程池
executor = ThreadPoolExecutor(max_workers=2)
# # 提交任务,把执行的函数提交到线程池中,是立即返回 非阻塞
# task1 = executor.submit(get_html,(3))
# task2 = executor.submit(get_html,(2))
#
# # done方法用于判定某个任务是否完成
# print(task1.done())
# print(task2.cancel())  # 取消某一个任务 返回True 或False,若任务状态在执行中或完成是取消不了的,只要在还没开始执行可以取消
# time.sleep(3)
# print(task1.done())
#
# # result 获取task返回结果 是阻塞的
# print(task1.result())


# -----------------------
# 要获取已经成功的task的返回

# 批量提交任务
urls = [3,2,4]
all_task = [executor.submit(get_html,(url)) for  url in  urls]

# 用于阻塞主线程, 等子线程执行完 在执行主线程,也可以设置条件,等某子线程执行完 返回主线程
wait(all_task)
print("主线程")

# # 示例一
# for future in as_completed(all_task):
#     data = future.result()
#     print("get {} page success".format(data))
#
# 示例2 map 返回顺序和url顺序是一致的
# for data in executor.map(get_html,urls):
#     print("get {} page ".format(data))

 

posted @ 2022-11-13 12:40  钟鼎山林  阅读(34)  评论(0)    收藏  举报