我们目前有一个主程序需要花费大量时间进行计算以创建自定义对象,我们希望使用更多来自线程和处理的功能,我们尝试使用线程,但它最终是一个坏主意,因为GIL。
我现在正在尝试使用Multiprocessing,使用可以进行计算然后通过结果队列返回对象的进程类,但我们不希望我们的主程序等待每个进程完成并在此期间冻结时间,我们想使用进度条,因为那些计算需要花费很多时间,我们需要通知用户界面。
这就是我尝试使用" master"启动其他人的过程,然后等待他们而不是主程序。
我们想要实现的目标: - 我们首先创建一个subProcess(来自main),它将启动其他(dataProcess),然后等待它们完成。 - 当dataProcess结束时,它将对象添加到subProcess可以看到的结果队列中,然后......我们需要一种方法将此对象传递给主程序,然后它可以更新进度等等。 (主程序已经知道他需要多少物品才能获得100%)
这是实际的简化代码:
from multiprocessing import Process, JoinableQueue, Queue, cpu_count
class dataProcess(Process):
def __init__(self, queue, result):
self.queue = queue
self.result = result
Process.__init__(self)
def run(self):
while 1:
object = self.queue.get()
if object is None:
self.queue.task_done()
break
# Working with object and creating an object as a result
self.queue.task_done()
self.result.put(result)
class subProcess(Process):
def __init__(self, objectList):
self.objects = objectList
Process.__init__(self)
def run(self):
self.queue = JoinableQueue()
self.result_queue = Queue()
self.processes = cpu_count()
for object in self.objects:
self.queue.put(object)
for i in range(self.processes):
self.queue.put(None)
for i in range(self.nbProcess):
process = dataProcess(self.queue, self.result_queue)
process.start()
print "New Process Start"
while 1:
for object in iter(self.result_queue.get, None):
if object.complete: # Boolean attribute of my object, true when dataProcess is done
print "complete !"
# Now I need to send this freshly new object to the main program !
# Main program can update a QProgressbar and can use the object
self.queue.join()
为我们的" subProcess"使用线程代替进程在debuging工作正常但它只是用Python IDLE无限期冻结UI(它可能一次只能使用1个线程,然后它冻结UI)
有没有办法执行此操作?
感谢您的回答
编辑: 我只是通过执行以下操作来运行subProcess:
process = subProcess(objectList)
process.start()
(在QMainWindow内)
使用线程我会使用一个信号,如:
thread = subThread(objectList)
self.connect(thread, SIGNAL("end"), self.receiveObject)
thread.start()
def receiveObject(self, object):
# Do whatever we need