用python实现的线程池实例代码


Posted in Python onJanuary 06, 2018

python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。

如果你用的是python2,那可以下载一个模块,叫threadpool,这是线程池。对于进程池可以使用python自带的multiprocessing.Pool。

当然也可以自己写一个threadpool。

# coding:utf-8
 
import Queue
import threading
import sys
import time
import math
 
 
class WorkThread(threading.Thread):
 
  def __init__(self, task_queue):
    threading.Thread.__init__(self)
    self.setDaemon(True)
    self.task_queue = task_queue
    self.start()
    self.idle = True
 
  def run(self):
    sleep_time = 0.01 # 第1次无任务可做时休息10毫秒
    multiply = 0
    while True:
      try:
        # 从队列中取一个任务
        func, args, kwargs = self.task_queue.get(block=False)
        self.idle = False
        multiply = 0
        # 执行之
        func(*args, **kwargs)
      except Queue.Empty:
        time.sleep(sleep_time * math.pow(2, multiply))
        self.idle = True
        multiply += 1
        continue
      except:
        print sys.exc_info()
        raise
 
 
class ThreadPool:
 
  def __init__(self, thread_num=10, max_queue_len=1000):
    self.max_queue_len = max_queue_len
    self.task_queue = Queue.Queue(max_queue_len) # 任务等待队列
    self.threads = []
    self.__create_pool(thread_num)
 
  def __create_pool(self, thread_num):
    for i in xrange(thread_num):
      thread = WorkThread(self.task_queue)
      self.threads.append(thread)
 
  def add_task(self, func, *args, **kwargs):
    '''添加一个任务,返回任务等待队列的长度
      调用该方法前最后先调用isSafe()判断一下等待的任务是不是很多,以防止提交的任务被拒绝
    '''
    try:
      self.task_queue.put((func, args, kwargs))
    except Queue.Full:
      raise # 队列已满时直接抛出异常,不给执行
    return self.task_queue.qsize()
 
  def isSafe(self):
    '''等待的任务数量离警界线还比较远
    '''
    return self.task_queue.qsize() < 0.9 * self.max_queue_len
 
  def wait_for_complete(self):
    '''等待提交到线程池的所有任务都执行完毕
    '''
    #首先任务等待队列要变成空
    while not self.task_queue.empty():
      time.sleep(1)
    # 其次,所以计算线程要变成idle状态
    while True:
      all_idle = True
      for th in self.threads:
        if not th.idle:
          all_idle = False
          break
      if all_idle:
        break
      else:
        time.sleep(1)
 
 
if __name__ == '__main__':
  def foo(a, b):
    print a + b
    time.sleep(0.01)
  thread_pool = ThreadPool(10, 100)
  '''在Windows上测试不通过,Windows上Queue.Queue不是线程安全的'''
  size = 0
  for i in xrange(10000):
    try:
      size = thread_pool.add_task(foo, i, 2 * i)
    except Queue.Full:
      print 'queue full, queue size is ', size
  time.sleep(2)

总结

以上就是本文关于用python实现的线程池实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
分析python动态规划的递归、非递归实现
Mar 04 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
详解django2中关于时间处理策略
Mar 06 Python
Python实现合并excel表格的方法分析
Apr 13 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 Python
Python实现生成密码字典的方法示例
Sep 02 Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
python raise的基本使用
Sep 10 Python
python字符串拼接+和join的区别详解
Dec 03 Python
pip matplotlib报错equired packages can not be built解决
Jan 06 #Python
Python实现的朴素贝叶斯分类器示例
Jan 06 #Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 #Python
Python爬虫中urllib库的进阶学习
Jan 05 #Python
浅谈django model postgres的json字段编码问题
Jan 05 #Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 #Python
Python3 queue队列模块详细介绍
Jan 05 #Python
You might like
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP图片加水印实现方法
2016/05/06 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
js格式化货币数据实现代码
2013/09/04 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
Angular.js中下拉框实现渲染html的方法
2017/06/18 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
小程序文字跑马灯效果
2018/12/28 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
python实现rsa加密实例详解
2017/07/19 Python
在Python中增加和插入元素的示例
2018/11/01 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
python多线程并发实例及其优化
2019/06/27 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
安娜卡列尼娜观后感
2015/06/11 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python