用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编程中三条常用的技巧
May 11 Python
python实现简单socket通信的方法
Apr 19 Python
Python内置函数 next的具体使用方法
Nov 24 Python
Python回文字符串及回文数字判定功能示例
Mar 20 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
Python简单处理坐标排序问题示例
Jul 11 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
python3跳出一个循环的实例操作
Aug 18 Python
matplotlib教程——强大的python作图工具库
Oct 15 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php获取随机数组列表的方法
2014/11/13 PHP
php中使用sftp教程
2015/03/30 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
2017/04/03 jQuery
JS中的BOM应用
2018/02/02 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
python3处理word文档实例分析
2020/12/01 Python
python的setattr函数实例用法
2020/12/16 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
高等教育专业自荐信范文
2014/03/26 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
文明礼仪伴我行演讲稿
2014/05/12 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
致男子1500米运动员的广播稿
2019/11/08 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers