用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的Django框架使用的一些实用建议
Apr 03 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
python实现求最长回文子串长度
Jan 22 Python
python+pandas分析nginx日志的实例
Apr 28 Python
Django添加sitemap的方法示例
Aug 06 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
python输入错误后删除的方法
Oct 12 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
Python timer定时器两种常用方法解析
Jan 20 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
python实现简单猜单词游戏
Dec 24 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
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Laravel框架控制器的middleware中间件用法分析
2019/09/30 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
JS DOMReady事件的六种实现方法总结
2016/11/23 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
vue实现菜单切换功能
2019/05/08 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
八大排序算法的Python实现
2021/01/28 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
莫斯科绝对前卫最秘密的商店:SVMoscow
2017/10/23 全球购物
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
实习生辞职信范文
2015/03/02 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript