所以现在我正在尝试创建一个执行一系列任务(Process子类)的Python程序。我想知道的一件事是Process完成了。理想情况下,我想要做的是让Process子类对调用进程进行回调,以便将下一个Process添加到队列中。以下是我到目前为止的情况:
from multiprocessing import Process, Queue
import time
class Task1(Process):
def __init__(self, queue):
super(Task1, self).__init__()
self.queue = queue
def run(self):
print 'Start Task 1'
time.sleep(1)
print 'Completed Task 1'
# make a callback to the main process to alert it that its execution has completed
class Task2(Process):
def __init__(self, queue):
super(Task2, self).__init__()
self.queue = queue
def run(self):
print 'Start Task 2'
time.sleep(1)
print 'Completed Task 2'
# make a callback to the main process to alert it that its execution has completed
if __name__ == '__main__':
queue = Queue()
p1 = Process1(queue)
p1.start()
p1.join()
# need a callback of some sort to know when p1 has completed its execution in order to add Process2 into the queue
在Python之前,我主要使用Objective-C。我主要是试图为Process找到类似于完成块的东西。感谢。
答案 0 :(得分:2)
如果我正确理解您的问题,您的代码已经完成了您想要的操作!
p1.join()
将阻止主进程,直到p1
完成。如果p1.join()
没有错误地返回,则该进程必须已终止,您可以立即启动task2
。您的“回调”只是p1.join()
已正确返回的检查!
来自the documentation:
加入([超时]) 阻塞调用线程,直到调用join()方法的进程终止或直到发生可选超时。
如果超时为无,则没有超时。
一个过程可以连接多次。
进程无法加入自身,因为这会导致死锁。尝试在进程启动之前加入进程是错误的。
编辑: (可选)如果您需要非阻塞解决方案,则可以轮询特定进程以查看它是否已终止:
p1.start()
while(p1.is_alive()):
pass #busy wait
p2.start()
这与p1.join
完全相同,但是在这种情况下,您可以在等待pass
完成时将p1
替换为有用的工作。
答案 1 :(得分:2)
函数是Python中的一等公民,所以你可以将它们作为参数传递, 例如你的任务构造者:
def __init__(self, queue, callb):
super(Task2, self).__init__()
self.queue = queue
self.callb = callb
然后你可以在run方法完成后调用它们:
def run(self):
print 'Start Task 2'
time.sleep(1)
print 'Completed Task 2'
self.callb(self)
在某处定义一个函数,例如
def done(arg):
print "%s is done" % arg
并将其传递给任务构造函数:
p1 = Task1(queue, done)