创建一个线程池:

import time
from concurrent.futures import ProcessPoolExecutor, as_completed
def get_html(n):
time.sleep(n)
print('subprogram {} success'.format(n))
return n
if __name__ == '__main__':
executor = ProcessPoolExecutor(max_workers=2)
all_task = [executor.submit(get_html, i) for i in range(3)] # 注意创建submit函数的时候,里面的参数是单个的,并不是元组形式传入。
for futrue in as_completed(all_task):
print(futrue.result()) subprogram 0 success
0
subprogram 1 success
1
subprogram 2 success
2

Future对象的理解:

  在我们创建submit()的时候会立即返回一个future对象,这个对象可能是没有完成的,但是会在将来某个时候完成,所以它是一个未来对象,或者叫做task的返回容器,保存task的执行状态及执行结果。(注意future与task的区别)

看submit()源码:

f = _base.Future()
w = _WorkItem(f, fn, args, kwargs) self._pending_work_items[self._queue_count] = w
self._work_ids.put(self._queue_count)
self._queue_count += 1
# Wake up queue management thread
self._result_queue.put(None) self._start_queue_management_thread()
return f

首先在调用submit()的时候就创建一个future, 然后将future作为参数,和线程执行函数及参数一起传入一个_WorkItem类,所以实际上_WorkItem是线程执行的一个单元,最后再将_WorkItem类放入一线程池的队列_work_ids中。然后计算加入的_WorkItem数量。self._queue_count,当启动的线程数量小于线程池的max_workers时候,就会立刻启动一个线程,该线程以_work_ids作为参数,从里面取出一个_WorkItem开始运行。

最新文章

  1. CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】
  2. HP工控机 G9 安装系统需注意
  3. 新浪微博SDK的使用
  4. 内存溢出(heap corruption detected:)
  5. Oracle分析函数之FIRST_VALUE和LAST_VALUE
  6. keil中for循环变量递减,无法跳出循环的问题
  7. 畅通工程续(Dijkstra算法)
  8. Kindle电子阅读器收不到个人文档推送解决方案
  9. 吾八哥学Selenium(四):操作下拉框select标签的方法
  10. 20164318 毛瀚逸 Exp4 恶意代码分析
  11. git push时报错refusing to merge unrelated histories
  12. Python学习(十三) —— 网络编程
  13. sdn测量论文简介
  14. bootstrap 前端模板
  15. NodeJs使用nodejs-websocket + protobuf
  16. Vue脚手架使用步骤 2.9.6版本
  17. 11-OpenLDAP主从同步
  18. CDH集群中YARN的参数配置
  19. linux 下安装 redis
  20. Linux下MySql的配置文件my.cnf详细 讲解

热门文章

  1. 不了解MES系统中的看板管理?看完本文就懂了
  2. Android培训准备资料之Android开发环境的搭建
  3. LeetCode学习_day1:原地算法
  4. 1. jenkins 安装部署
  5. Spring Boot Quartz 动态配置,持久化
  6. Python搭建HTTP服务
  7. struct和class内存大小的计算
  8. Nginx主配置文件说明
  9. Linux性能优化实战学习笔记:第八讲
  10. Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解