是什么

如何用

常用方法一:with ThreadPoolExecutor as t: t.submit

import concurrent.futures

import urllib.request

URLS = ['http://www.foxnews.com/',

'http://www.cnn.com/',

'http://europe.wsj.com/',

'http://www.bbc.co.uk/',

'http://some-made-up-domain.com/']

# Retrieve a single page and report the URL and contents

def load_url(url, timeout):

with urllib.request.urlopen(url, timeout=timeout) as conn:

return conn.read()

# We can use a with statement to ensure threads are cleaned up promptly

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:

# Start the load operations and mark each future with its URL

future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}

for future in concurrent.futures.as_completed(future_to_url):

url = future_to_url[future]

try:

data = future.result()

except Exception as exc:

print('%r generated an exception: %s' % (url, exc))

else:

print('%r page is %d bytes' % (url, len(data)))

常用方法二:tornado中使用@run_on_executor注解

class NoBlockingHnadler(tornado.web.RequestHandler):

executor = ThreadPoolExecutor(4)

@run_on_executor

def sleep(self, second):

time.sleep(second)

return second

@gen.coroutine

def get(self):

second = yield self.sleep(5)

self.write('noBlocking Request: {}'.format(second))

原理

ThreadPoolExecutor定义了一个队列,每次将提交的任务put到一个队列中,然后执行调整线程数的方法_adjust_thread_count,从队列中取出worker,然后启动多线程执行worker

class ThreadPoolExecutor(_base.Executor):

def __init__(self, max_workers=None):

"""Initializes a new ThreadPoolExecutor instance.

Args:

max_workers: The maximum number of threads that can be used to

execute the given calls.

"""

if max_workers is None:

# Use this number because ThreadPoolExecutor is often

# used to overlap I/O instead of CPU work.

max_workers = (os.cpu_count() or 1) * 5

if max_workers <= 0:

raise ValueError("max_workers must be greater than 0")

self._max_workers = max_workers

self._work_queue = queue.Queue()

self._threads = set()

self._shutdown = False

self._shutdown_lock = threading.Lock()

def submit(self, fn, *args, **kwargs):

with self._shutdown_lock:

if self._shutdown:

raise RuntimeError('cannot schedule new futures after shutdown')

f = _base.Future()

w = _WorkItem(f, fn, args, kwargs)

self._work_queue.put(w)

self._adjust_thread_count()

return f

submit.__doc__ = _base.Executor.submit.__doc__

def _adjust_thread_count(self):

# When the executor gets lost, the weakref callback will wake up

# the worker threads.

def weakref_cb(_, q=self._work_queue):

q.put(None)

# TODO(bquinlan): Should avoid creating new threads if there are more

# idle threads than items in the work queue.

if len(self._threads) < self._max_workers:

t = threading.Thread(target=_worker,

args=(weakref.ref(self, weakref_cb),

self._work_queue))

t.daemon = True

t.start()

self._threads.add(t)

_threads_queues[t] = self._work_queue

def shutdown(self, wait=True):

with self._shutdown_lock:

self._shutdown = True

self._work_queue.put(None)

if wait:

for t in self._threads:

t.join()

shutdown.__doc__ = _base.Executor.shutdown.__doc__

参考

文章来源: www.oschina.net,作者:项昂之的微博客,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/csp277/blog/3215629

python线程池原理_Python3线程池ThreadPoolExecutor总结相关推荐

  1. c++ socket线程池原理_ThreadPoolExecutor线程池实现原理+源码解析

    推荐学习 被微服务轰炸?莫怕!耗时35天整出的「微服务学习教程」送你 死磕「并发编程」100天,全靠阿里大牛的这份最全「高并发套餐」 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银 ...

  2. Java高并发编程详解系列-线程池原理自定义线程池

    之前博客的所有内容是对单个线程的操作,例如有Thread和Runnable的使用以及ThreadGroup等的使用,但是对于在有些场景下我们需要管理很多的线程,而对于这些线程的管理有一个统一的管理工具 ...

  3. python 定时器实现原理_python线程定时器Timer实现原理解析

    这篇文章主要介绍了python线程定时器Timer实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.线程定时器Timer原理 原理比较 ...

  4. linux取消线程的原理,linux线程的取消(终止)方法

    关键: pthread_cancel函数发送终止信号 pthread_setcancelstate函数设置终止方式 pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程 ...

  5. java线程饥饿原理,Java线程饥饿和锁的公平性「译」

    一个线程因为被其它线程抢占了而分配不到时间片,这就是[饥饿].这个线程[饿的要死]因为只有别的线程可以得到CPU时间片,就它得不到.解决饥饿的方法叫着公平性--所有的线程都有机会得到运行. 线程饥饿的 ...

  6. python注解实现原理_Python3注解+可变参数实现

    一.说明 1.1 关于注解 关于注解这个东西,最早是在大学学java的时候经常会看到某些方法上边@override之类的东西,一方面不知道其作用但另一方面似乎去掉也没什么影响,所以一直都不怎么在意. ...

  7. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  8. ThreadPoolExecutor线程池原理

    ThreadPoolExecutor线程池原理 线程池原理 1. 线程池的简单介绍 1.1 线程池是什么 1.2 线程池解决的核心问题是什么 2. 线程池的实现原理 2.1 线程池的执行流程 2.2 ...

  9. 一文搞懂线程池原理——Executor框架详解

    文章目录 1 使用线程池的好处 2 Executor 框架 2.1 Executor 框架结构 2.2 Executor 框架使用示意图 2.3 Executor 框架成员 2.3.1 Executo ...

最新文章

  1. 微分方程 ode45() 求解并绘制曲线
  2. C++实现has-a关系的两种方法
  3. java 数据库工厂_月光软件站 - 编程文档 - Java - 简单的数据库连接工厂实现
  4. UOJ #579. 树上的颜色
  5. CRM产品主数据在行业解决方案industry solution中的应用
  6. 超简单调整Fedora25遇到的字体小问题——字体渲染问题和输入框内容显示不全...
  7. php_sapi常量,PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
  8. Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...
  9. ASP.NET 安全认证(四)
  10. 禁止存放到内存_暴雨 ! 神木能源局:关于煤炭运输及存放的通告
  11. HashMap 的 7 种遍历方式+性能分析!
  12. php接收post写入文件,PHP中Post和Get获取数据写入文件中
  13. 芯原股份正式加入UCIe产业联盟
  14. h5实现海报分享功能
  15. linux阿帕奇服务器配置方案,阿帕奇服务器_服务器配置方案_linux配置apache服务器...
  16. 本地化ASP.NET core模型绑定错误消息
  17. 【数据结构】【A鹿】malloc和其他相关预备知识
  18. Win10调整各窗口的任务栏位置
  19. 3D人体姿态估评估指标
  20. Chrome实现独立代理

热门文章

  1. 网站时间显示——基于Date
  2. HTTP和WebSocket协议(二)
  3. POJ3254Corn Fields——状态压缩dp
  4. 喜大普奔:我的个人博客www.yxmblog.top
  5. 图片 滚动切换效果(五) 高级篇
  6. JavaScript 继承
  7. 协议实现objective C 协议的实现
  8. MyCat分布式数据库集群架构工作笔记0009---Mycat主--从复制配置上
  9. Netty工作笔记0073---Neety的出站和入站机制
  10. mybatis工作笔记003---Mybatis批量删除deleteByIds的用法