+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-04(1)

2019-06(2)

2019-07(2)

2019-08(87)

2019-09(90)

Python 高级编程和异步IO并发编程 --11_7 ThreadPoolExecutor线程池

发布于2020-03-26 11:03     阅读(590)     评论(0)     点赞(22)     收藏(0)


  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor
  3. '''
  4. 线程池,为什么需要线程池?
  5. 1. 主线程中可以获取某一个线程的状态,或者某一个任务的状态,以及返回值。
  6. 2. 当一个线程完成的时候,主线程能立即知道,并获取状态
  7. 3. future可以让多线程和多进程编码,接口一致
  8. '''
  9. import time
  10. def get_html(times):
  11. time.sleep(times)
  12. print("get page {} success".format(times))
  13. return times
  14. executor = ThreadPoolExecutor(max_workers=2)
  15. # 通过submit函数提交执行的函数到线程池中,Submit非阻塞,立即返回
  16. task1 = executor.submit(get_html,(3)) # 传递的是函数名称,而不能是函数的调用get_html()
  17. task2 = executor.submit(get_html,(2))
  18. print(task1.done()) # done方法用于判断任务有没有执行成功
  19. print(task2.cancel()) # cancel 只能在submit返回的对象上操作,不可在executer上面操作。是future类的方法。
  20. # cancel方法在执行中,是无法取消的,只有在为开始执行时才可以取消。
  21. # executor = ThreadPoolExecutor(max_workers=2) 定义了同时有两个线程执行,因此task1/task2 已提交就立即执行,因此此处无法取消。
  22. time.sleep(4)
  23. print(task1.done())
  24. print(task1.result()) # result方法返回task的执行结果
  1. False
  2. False
  3. get page 2 success
  4. get page 3 success
  5. True
  6. 3
  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor
  3. '''
  4. 线程池,为什么需要线程池?
  5. 1. 主线程中可以获取某一个线程的状态,或者某一个任务的状态,以及返回值。
  6. 2. 当一个线程完成的时候,主线程能立即知道,并获取状态
  7. 3. future可以让多线程和多进程编码,接口一致
  8. '''
  9. import time
  10. def get_html(times):
  11. time.sleep(times)
  12. print("get page {} success".format(times))
  13. return times
  14. executor = ThreadPoolExecutor(max_workers=1)
  15. # 通过submit函数提交执行的函数到线程池中,Submit非阻塞,立即返回
  16. task1 = executor.submit(get_html,(3)) # 传递的是函数名称,而不能是函数的调用get_html()
  17. task2 = executor.submit(get_html,(2))
  18. print(task1.done()) # done方法用于判断任务有没有执行成功
  19. print(task2.cancel())
  20. '''
  21. # cancel 只能在submit返回的对象上操作,不可在executer上面操作。是future类的方法。
  22. # cancel方法在执行中,是无法取消的,只有在为开始执行时才可以取消。
  23. # 更新为executor = ThreadPoolExecutor(max_workers=1) 定义了同时有一个线程执行,因此只有task1提交,task2就可以取消。
  24. '''
  25. time.sleep(4)
  26. print(task1.done())
  27. print(task1.result()) # result方法返回task的执行结果
  1. False
  2. True # Task已经成功取消
  3. get page 3 success # 不再打印get page 2 success
  4. True
  5. 3
  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor,as_completed
  3. '''
  4. 线程池,为什么需要线程池?
  5. 1. 主线程中可以获取某一个线程的状态,或者某一个任务的状态,以及返回值。
  6. 2. 当一个线程完成的时候,主线程能立即知道,并获取状态
  7. 3. future可以让多线程和多进程编码,接口一致
  8. '''
  9. import time
  10. def get_html(times):
  11. time.sleep(times)
  12. print("get page {} success".format(times))
  13. return times
  14. executor = ThreadPoolExecutor(max_workers=2)
  15. # 获取已经成功的task值,用as_completed 方法,它是一个生成器方法,只会返回已经成功的yield
  16. urls = [3,2,4] # 假设定义三个url,sleep3秒1个,2秒1个,4秒1个。
  17. all_task = [executor.submit(get_html,(url)) for url in urls]
  18. for future in as_completed(all_task):
  19. data = future.result()
  20. print("page {} success".format(data))
  1. get page 2 success
  2. page 2 success
  3. get page 3 success
  4. page 3 success
  5. get page 4 success
  6. page 4 success
  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor,as_completed
  3. import time
  4. def get_html(times):
  5. time.sleep(times)
  6. print("get page {} success".format(times))
  7. return times
  8. executor = ThreadPoolExecutor(max_workers=2)
  9. # 获取已经成功的task值,用as_completed 方法,它是一个生成器方法,只会返回已经成功的yield
  10. urls = [3,2,4] # 假设定义三个url,sleep3秒1个,2秒1个,4秒1个。
  11. all_task = [executor.submit(get_html,(url)) for url in urls]
  12. # 通过executor获取已经完成的task
  13. for data in executor.map(get_html,urls):
  14. print("page {} success".format(data))
  1. get page 2 success
  2. get page 3 success
  3. get page 3 success
  4. page 3 success
  5. get page 4 success
  6. get page 2 success
  7. page 2 success
  8. get page 4 success
  9. page 4 success
  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor,as_completed,wait
  3. import time
  4. def get_html(times):
  5. time.sleep(times)
  6. print("get page {} success".format(times))
  7. return times
  8. executor = ThreadPoolExecutor(max_workers=2)
  9. # 获取已经成功的task值,用as_completed 方法,它是一个生成器方法,只会返回已经成功的yield
  10. urls = [3,2,4] # 假设定义三个url,sleep3秒1个,2秒1个,4秒1个。
  11. all_task = [executor.submit(get_html,(url)) for url in urls]
  12. wait(all_task) # 等待所有的线程执行完。
  13. print("All Task Completed")
  1. get page 2 success
  2. get page 3 success
  3. get page 4 success
  4. All Task Completed
  1. from concurrent import futures
  2. from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED
  3. import time
  4. def get_html(times):
  5. time.sleep(times)
  6. print("get page {} success".format(times))
  7. return times
  8. executor = ThreadPoolExecutor(max_workers=2)
  9. # 获取已经成功的task值,用as_completed 方法,它是一个生成器方法,只会返回已经成功的yield
  10. urls = [3,2,4] # 假设定义三个url,sleep3秒1个,2秒1个,4秒1个。
  11. all_task = [executor.submit(get_html,(url)) for url in urls]
  12. wait(all_task,return_when=FIRST_COMPLETED) # 第一个线程执行完就打印
  13. print("All Task Completed")
  1. get page 2 success
  2. All Task Completed
  3. get page 3 success
  4. get page 4 success

 

原文链接:https://blog.csdn.net/f2157120/article/details/105086264



所属网站分类: 技术文章 > 博客

作者:智慧星辰

链接: https://www.pythonheidong.com/blog/article/285045/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)