用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字符串排序方法
Aug 29 Python
Python实现的一个简单LRU cache
Sep 26 Python
Python是编译运行的验证方法
Jan 30 Python
Python模拟简单电梯调度算法示例
Aug 20 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
Python如何基于Tesseract实现识别文字功能
Jun 05 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
Python入门之基础语法详解
May 11 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
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP Cli 模式设置进程名称的方法
2019/06/12 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
TBCompressor js代码压缩
2011/01/05 Javascript
JavaScript检查某个function是否是原生代码的方法
2014/08/20 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
2016/05/10 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
Python获取文件所在目录和文件名的方法
2017/01/12 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python高级property属性用法实例分析
2019/11/19 Python
python和js交互调用的方法
2020/06/23 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
护理实习自我鉴定
2013/12/14 职场文书
社区志愿者活动总结
2014/06/26 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
创先争优个人总结
2015/03/04 职场文书
山楂树之恋观后感
2015/06/11 职场文书
舞出我人生观后感
2015/06/16 职场文书
大学军训心得体会800字
2016/01/11 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
golang语言指针操作
2022/04/14 Golang
服务器nginx权限被拒绝解决案例
2022/09/23 Servers