Python进程完成

时间:2014-05-20 18:12:50

标签: python process queue

所以现在我正在尝试创建一个执行一系列任务(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找到类似于完成块的东西。感谢。

2 个答案:

答案 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)