返回信息流最近需要用到线程池,于是根据网上的一些资料改写了一个,但是实际运行的时候总是出问题, 实现如下:
import Queue
import sys
import threading
import time
#替我们工作的线程池中的线程
class MyThread(threading.Thread):
def __init__(self, workQueue, timeout = 10, **kwargs):
threading.Thread.__init__(self, kwargs=kwargs)
#线程在结束前等待任务队列多长时间
self.timeout = timeout
self.setDaemon(True)
self.workQueue = workQueue
self.start()
def run(self):
while True:
try:
#从工作队列中获取一个任务
callable, arg, para= self.workQueue.get(timeout=self.timeout)
#我们要执行的任务
callable(arg, para)
except Queue.Empty: #任务队列空的时候结束此线程
break
except :
print sys.exc_info()
raise
class ThreadPool:
def __init__(self, num_of_threads=10):
self.workQueue = Queue.Queue()
self.threads = []
self.__createThreadPool(num_of_threads)
def __createThreadPool(self, num_of_threads):
for i in range(num_of_threads):
thread = MyThread(self.workQueue)
self.threads.append(thread)
def wait_for_complete(self):
#等待所有线程完成。
while len(self.threads) >0:
thread = self.threads.pop()
#等待线程结束
if thread.isAlive():#判断线程是否还存活来决定是否调用join
thread.join()
def add_job(self, callable, arg, para):
self.workQueue.put((callable,arg, para))
有个不明白的地方是,如果某个线程完成后,是如何从任务队列中取一个任务运行的。。。
请各位大神指点一二啊~
附件(2.3KB) threadPool.py
这是一条镜像帖。来源:北邮人论坛 / python / #1656同步于 2014/7/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
python 线程池的问题
huainanyan
2014/7/14镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
【 在 Listjj 的大作中提到: 】
: 具体出啥错啊?
: 只知道Queue内部实现了同步机制
前期运行正常,但是过了一段时间后就不能够自动从作业队列中取job了,应该是实现的问题,最后只好调用了threadpool库。。。
MyThread.run 中
Queue.Empty 会使线程退出,但是你又没有补充线程
当执行速度大于添加任务速度的时候,线程全部退出,再增加任务就执行不了了
在我的程序中执行速度要小于任务添加的速度...
所以在所有的任务都执行完之前workQueue不会为空
【 在 binux 的大作中提到: 】
: MyThread.run 中
: Queue.Empty 会使线程退出,但是你又没有补充线程
: 当执行速度大于添加任务速度的时候,线程全部退出,再增加任务就执行不了了
会不会是线程取任务阻塞?
#从工作队列中获取一个任务
callable, arg, para= self.workQueue.get(timeout=self.timeout, block=False)
【 在 huainanyan 的大作中提到: 】
:
: 前期运行正常,但是过了一段时间后就不能够自动从作业队列中取job了,应该是实现的问题,最后只好调用了threadpool库。。。