用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中设计模式之Decorator装饰器模式的要点
Mar 02 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python3列表内置方法大全及示例代码小结
May 10 Python
Python 私有化操作实例分析
Nov 21 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Python打印特殊符号及对应编码解析
May 07 Python
django中related_name的用法说明
May 20 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
分布式全文检索引擎ElasticSearch原理及使用实例
Nov 14 Python
python的数学算法函数及公式用法
Nov 18 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
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
Python写的贪吃蛇游戏例子
2014/06/16 Python
Ruby元编程基础学习笔记整理
2016/07/02 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python openCV自制绘画板
2020/10/27 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
思想政治教育专业个人求职信范文
2013/12/20 职场文书
初中化学教学反思
2014/01/23 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
企业精神口号
2014/06/11 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
创先争优个人承诺书
2014/08/30 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL