from concurrent.futures import ThreadPoolExecutor, as_completed, wait
import time
# 线程池 为什么要线程池?
# 主线程中可以获取某一个线程的状态或者某一个任务的状态,以及返回值
# 当一个线程结束后主线程能立刻知道线程结束了
# futures 可以让多线程和多进程接口一致
def get_html(times):
time.sleep(3)
print('thread is successed', times)
return '完成了'
if __name__ == '__main__':
executor = ThreadPoolExecutor(max_workers=3)
# result = task1.done()
# is_cancel = task2.cancel() # 取消线程运行 返回结果是 是否被取消 如果线程已经启动或者结束是不能被取消的
# print(task1)
# print(result)
# time.sleep(3)
# result1 = task1.done() # done方法判断是否执行完成
# print(task1.result()) # result方法获取函数返回值
# print(result1)
# 一次提交多个线程的做法
urls = ['https://www.zhijinyu.com/{}'.format(x) for x in range(10)]
all_tasks = [executor.submit(get_html, url) for url in urls] # 提交多个线程
print(all_tasks)
wait(all_tasks, return_when='FIRST_COMPLETED') # 阻塞所有线程完成才执行后面的问题 有一个参数叫return_when 什么时候继续执行
"""
return_when: Indicates when this function should return. The options
are:
FIRST_COMPLETED - Return when any future finishes or is # 第一个执行完毕
cancelled. #
FIRST_EXCEPTION - Return when any future finishes by raising an # 通过提出future,在任何future结束时返回。 如果没有将来会引发异常,那么它等同于ALL_COMPLETED。
exception. If no future raises an exception
then it is equivalent to ALL_COMPLETED.
ALL_COMPLETED - Return when all futures finish or are cancelled.
"""
print('main')
# for future in as_completed(all_tasks): # 获取所有线程的执行结果
# data = future.result()
# print(data)
# # 通过executor获取已经完成的task
# for future in executor.map(get_html, urls): # map返回的顺序和url的顺序是一致的
#
# print(future)
网友评论