用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实现把回车符\r\n转换成\n
Apr 23 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
python保存文件方法小结
Jul 27 Python
python实现微信小程序自动回复
Sep 10 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
git查看、创建、删除、本地、远程分支方法详解
Feb 18 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
python中复数的共轭复数知识点总结
Dec 06 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
javascript一点特殊用法
2008/05/28 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
vue加载自定义的js文件方法
2018/03/13 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python实现excel读写数据
2021/03/02 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
python2.7实现邮件发送功能
2018/12/12 Python
Python lambda表达式用法实例分析
2018/12/25 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
python实现PCA降维的示例详解
2020/02/24 Python
Python yield的用法实例分析
2020/03/06 Python
python中字典增加和删除使用方法
2020/09/30 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
经典的毕业生自荐信范文
2014/04/14 职场文书
体育课外活动总结
2014/07/08 职场文书
2014年营业员工作总结
2014/11/18 职场文书
老公保证书
2015/01/17 职场文书
工作岗位职责范本
2015/02/15 职场文书
元旦主持词开场白
2015/05/29 职场文书
委托收款证明
2015/06/23 职场文书