用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之引用和类属性的初步理解
May 15 Python
python实现的udp协议Server和Client代码实例
Jun 04 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
用Python实现KNN分类算法
Dec 22 Python
pandas修改DataFrame列名的方法
Apr 08 Python
python验证码识别教程之利用滴水算法分割图片
Jun 05 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
python 操作mysql数据中fetchone()和fetchall()方式
May 15 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 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
一些不错的js函数ajax
2008/08/20 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
Jquery 扩展方法
2010/05/06 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
Javascript快速排序算法详解
2014/12/03 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
webpack构建的详细流程探底
2018/01/08 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
JavaScript中的Proxy对象
2020/11/27 Javascript
python中的内置函数getattr()介绍及示例
2014/07/20 Python
简介Python中用于处理字符串的center()方法
2015/05/18 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
Django分页功能的实现代码详解
2019/07/29 Python
python使用minimax算法实现五子棋
2019/07/29 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
女方婚礼新郎答谢词
2014/01/11 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
七一晚会主持词
2015/06/29 职场文书
日元符号 ¥
2022/02/17 杂记