用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中字典的循环遍历的两种方式
Feb 07 Python
Python查询IP地址归属完整代码
Jun 21 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
Python语言实现百度语音识别API的使用实例
Dec 13 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 Python
python使用KNN算法识别手写数字
Apr 25 Python
Python求均值,方差,标准差的实例
Jun 29 Python
基于python3实现倒叙字符串
Feb 18 Python
python计算导数并绘图的实例
Feb 29 Python
python关于变量名的基础知识点
Mar 03 Python
python中selenium库的基本使用详解
Jul 31 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获取金书网的书名的实现代码
2010/06/11 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Yii2框架使用计划任务的方法
2016/05/25 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
js实现文字截断功能
2016/09/14 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
python学习手册中的python多态示例代码
2014/01/21 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
python迭代dict的key和value的方法
2018/07/06 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
python如何写个俄罗斯方块
2020/11/06 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
家庭教育先进个人事迹材料
2014/01/24 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
xxx同志考察材料
2014/02/07 职场文书
法律六进活动方案
2014/03/13 职场文书
医院节能减排方案
2014/06/13 职场文书
家庭困难证明
2014/10/12 职场文书
升职自荐信范文
2015/03/27 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang