用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单链表实现代码实例
Nov 21 Python
python logging日志模块的详解
Oct 29 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python 字符串与二进制串的相互转换示例
Jul 23 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
Python基础之元组与文件知识总结
May 19 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 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
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
音乐播放用的的几个函数
2006/09/07 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
window.onload与$(document).ready()的区别分析
2015/05/30 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
Python实现将文本生成二维码的方法示例
2017/07/18 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
2020/04/17 Python
浅谈html5增强的页面元素
2016/06/14 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
给护士表扬信
2014/01/19 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
旷课检讨书3000字
2014/02/04 职场文书
志愿者活动总结
2014/04/28 职场文书
感谢信范文大全
2015/01/23 职场文书
个人工作年终总结
2015/03/09 职场文书
年底个人总结范文
2015/03/10 职场文书
2015年教研工作总结
2015/05/23 职场文书