在Python中以有序和并行的方式运行

时间:2014-10-29 14:43:29

标签: python multithreading

如何在Python中运行这样的程序:

main(): task 1 --> task 2 --> (task 3, task 4) --> task 5

说明:我运行任务1,然后运行任务2.完成任务2后,任务3和任务4并行运行。 完成任务3后,任务4立即完成。然后任务5运行。

我试过

try:
   thread.start_new_thread.task3
   thread.start_new_thread.task4
except:
    print " Unable to run "

但它的工作原理如下:

task 1 --> task 2 --> task 5(任务3和任务4从程序开始和完成开始工作)^ _ ^

1 个答案:

答案 0 :(得分:1)

使用此代码,您可以通过调用join来创建具有优先级的线程。线程将被锁定,直到前一个线程完成。请记住,您无法在尚未启动的线程上调用join。 task1task5是要调用的实际过程(必须定义的正常过程)。

要在task3完成时完成task4,请创建一个全局变量并让task4监视该变量。 task3必须设置task4必须等待的值。这取决于你如何做到,但没有内置的机制。如果你不想要全局变量,那么使用许多众所周知的python机制来避免这种情况(例如每个callable可能是一个实例的绑定方法)。

class CustomThread(threading.Thread):

    def __init__(group=None, target=None, name=None, prev=(), args=(), kwargs={}):
        super(CustomThread, self).__init__(group, target, name, args, kwargs)
        self.prev_threads = prev

    def run():
        for prev in self.prev_threads:
            prev.join()
        super(CustomThread, self).run()

try:
    thread1 = CustomThread(target=task1)
    thread2 = CustomThread(prev=[thread1], target=task2)
    thread3 = CustomThread(prev=[thread2], target=task3)
    thread4 = CustomThread(prev=[thread2], target=task4)
    thread5 = CustomThread(prev=[thread3,thread4], target=task5)
    #start the threads in this order or you'll get a RuntimeError
    thread1.start()
    thread2.start()
    thread3.start()
    thread4.start()
    thread5.start()
except:
    print " unable to run "