用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中操作文件之truncate()方法的使用教程
May 25 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
Python使用Scrapy爬取妹子图
May 28 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
python多线程socket编程之多客户端接入
Sep 12 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
python语言实现贪吃蛇游戏
Nov 13 Python
Python四款GUI图形界面库介绍
Jun 05 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从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
Javascript模板技术
2007/04/27 Javascript
js模拟实现Array的sort方法
2007/12/11 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
JS常用知识点整理
2017/01/21 Javascript
基于vue.js路由参数的实例讲解——简单易懂
2017/09/07 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[05:17]DOTA2誓师:今天我们在这里 明天TI4等我!
2014/03/26 DOTA
Python获取任意xml节点值的方法
2015/05/05 Python
python中的字典使用分享
2016/07/31 Python
python 读取、写入txt文件的示例
2020/09/27 Python
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
顶碗少年教学反思
2014/02/21 职场文书
自我鉴定总结
2014/03/24 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
2014年信访工作总结
2014/11/17 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
亲情作文之母爱
2019/09/25 职场文书
Python自然语言处理之切分算法详解
2021/04/25 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android