用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抓取京东价格分析京东商品价格走势
Jan 09 Python
python遍历类中所有成员的方法
Mar 18 Python
利用Python开发实现简单的记事本
Nov 15 Python
python机器学习之决策树分类详解
Dec 20 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
python装饰器的特性原理详解
Dec 25 Python
详解如何修改python中字典的键和值
Sep 29 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
python多线程和多进程关系详解
Dec 14 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面向对象编程快速入门
2006/12/14 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
2011/04/20 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
php查询及多条件查询
2017/02/26 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
JS中创建函数的三种方式及区别
2016/03/13 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
Vue项目实现简单的权限控制管理功能
2019/07/17 Javascript
JS正则表达式验证密码强度
2020/03/18 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
求职信格式范本
2013/11/15 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
大学体育课感想
2015/08/10 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
nginx rewrite功能使用场景分析
2022/05/30 Servers