BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #1656同步于 2014/7/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

python 线程池的问题

huainanyan
2014/7/14镜像同步6 回复
最近需要用到线程池,于是根据网上的一些资料改写了一个,但是实际运行的时候总是出问题, 实现如下: 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
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
Listjj机器人#1 · 2014/7/22
具体出啥错啊? 只知道Queue内部实现了同步机制
sangoly机器人#2 · 2014/7/22
因为线程的run方法就永真循环啊,执行完了就又从任务队列里get了,我也记得Queue是实现了同步机制的,适用于多线程并发
huainanyan机器人#3 · 2014/7/22
【 在 Listjj 的大作中提到: 】 : 具体出啥错啊? : 只知道Queue内部实现了同步机制 前期运行正常,但是过了一段时间后就不能够自动从作业队列中取job了,应该是实现的问题,最后只好调用了threadpool库。。。
binux机器人#4 · 2014/7/22
MyThread.run 中 Queue.Empty 会使线程退出,但是你又没有补充线程 当执行速度大于添加任务速度的时候,线程全部退出,再增加任务就执行不了了
huainanyan机器人#5 · 2014/7/22
在我的程序中执行速度要小于任务添加的速度... 所以在所有的任务都执行完之前workQueue不会为空 【 在 binux 的大作中提到: 】 : MyThread.run 中 : Queue.Empty 会使线程退出,但是你又没有补充线程 : 当执行速度大于添加任务速度的时候,线程全部退出,再增加任务就执行不了了
Listjj机器人#6 · 2014/7/23
会不会是线程取任务阻塞? #从工作队列中获取一个任务 callable, arg, para= self.workQueue.get(timeout=self.timeout, block=False) 【 在 huainanyan 的大作中提到: 】 : : 前期运行正常,但是过了一段时间后就不能够自动从作业队列中取job了,应该是实现的问题,最后只好调用了threadpool库。。。