用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分割TXT文件成4K的TXT文件
May 23 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
python flask 多对多表查询功能
Jun 25 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
对numpy中shape的深入理解
Jun 15 Python
解析PyCharm Python运行权限问题
Jan 08 Python
使用Django清空数据库并重新生成
Apr 03 Python
Pycharm安装python库的方法
Nov 24 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
Python字典和列表性能之间的比较
Jun 07 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流量统计功能的实现代码
2012/09/29 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
js如何取消事件冒泡
2013/09/23 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
JS简易计算器实例讲解
2020/06/30 Javascript
Python实现KNN邻近算法
2021/01/28 Python
PyQt5响应回车事件的方法
2019/06/25 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
简述synchronized和java.util.concurrent.locks.Lock的异同
2014/12/08 面试题
附答案的Java面试题
2012/11/19 面试题
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
家长会主持词
2014/03/26 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
师德先进个人材料
2014/12/20 职场文书
唐山大地震的观后感
2015/06/05 职场文书
结婚幸福感言
2015/08/01 职场文书
父亲节感言
2015/08/03 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python