用python实现的线程池实例代码
作者:Orisun 发布时间:2023-11-06 23:04:54
标签:python,线程池
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)
来源:http://www.cnblogs.com/zhangchaoyang/articles/5188904.html
0
投稿
猜你喜欢
- 1、对继承的理解继承(Inheritance) :代码复用的高级抽象继承是面向对象设计的精髓之一实现了以类为单位的高级抽象级别代码复用继承是
- QCalendarWidget 是日历控件。它允许用户以简单和直观的方式选择日期。#!/usr/bin/python3# -*- codin
- Dmitry这篇设计评论表单很有启发意义,尤其提到关键的评论内容、评论者信息录入顺序问题。好比我们在日常沟通时,对信息的反馈都是第一诉求,写
- 1.字典的概念字典和列表类似,也是可变序列,不过和列表不同,它是无序的可变序列,保存的内容是以键值对(key:value)形式存放的 字典的
- 当py文件中引用了库face_recognition但是python中没有安装这个库的时候,就会出现No module named '
- 简介由于http协议的请求是无状态的。故为了让用户在浏览器中再次访问该服务端时,他的登录状态能够保留(也可翻译为该用户访问这个服务端其他网页
- 目录总体思路:判断链接是否指向文件:下载文件:获取 url 下的所有链接:最近维基 jie mi 彻底公开了网站的全部文件,我就在想如何使用
- pydantic是一个Python的数据验证和转换库,它的特点是轻量、快速、可扩展、可配置。笔者常用的用于数据接口schema定义与检查。具
- 使用celery在django项目中实现异步发送短信在项目的目录下创建celery_tasks用于保存celery异步任务。在celery_
- 本文实例讲述了Python面向对象程序设计类的多态用法。分享给大家供大家参考,具体如下:多态1、多态使用一种事物的多种体现形式,举例:动物有
- 前言:之前,我写笔记的工具一直都是 notion,而且没有写博客的习惯。但是一是由于 notion 的服务器在
- 导航标签彼此互斥、完全穷尽。导航标签其实就是一种文字表达形式,我们用标签来代表网站上的各种分类信息。比如“联系我们”这个标签,代表的内容通常
- 时隔一年,重拾python,想在pycharm里面使用jupyter完成一些小demo,结果一年后的jupyter死活没有token,连都连
- 具体代码如下所示:from operator import itemgetter #itemgetter用来去dict中的key,省去了使用
- 可试试下面这个方法,但要保证在FORM中使用的Input Name都和数据库中使用的是一样的:upfiles.asp<% &
- 记得很早以前看到过这样的一段介绍:想象你在逛街边的一家书店,如果最终你没有购买任何图书就直接离开了,店长并不会知道你来过。但是如果你买了书,
- 针对很普遍的每个元素的操作会遍历每个元素进行操作。这里给出了几种写法,列表每个元素自增等数学操作同理;示例:整形列表ilist加1个数、元素
- 一开始没看懂stddev是什么参数,找了一下,在tensorflow/python/ops里有random_ops,其中是这么写的:def
- 最近,我们老大要我写一个守护者程序,对服务器进程进行守护。如果服务器不幸挂掉了,守护者能即时的重启应用程序。上网Google了一下,发现Py
- 看youa的源码发现的,原来flash可以有fallback content:<object type="applicati