用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 字典dict使用介绍
Nov 30 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
详解Django缓存处理中Vary头部的使用
Jul 24 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
使用python模拟高斯分布例子
Dec 09 Python
关于tf.reverse_sequence()简述
Jan 20 Python
Python如何使用神经网络进行简单文本分类
Feb 25 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
用Socket发送电子邮件
2006/10/09 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
destoon数据库表说明汇总
2014/07/15 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
Jquery给基本控件的取值、赋值示例
2014/05/23 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
vue指令做滚动加载和监听等
2019/05/26 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
企业廉洁教育心得体会
2016/01/20 职场文书
终止合同协议书范本
2016/03/22 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
oracle连接ODBC sqlserver数据源的详细步骤
2021/07/25 Oracle