2014-10-29 37 views
-3

如何使一个Python程序运行这样的:运行有序,并行在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从方案制定开始和结束)^ _^

+0

在任务2之后和任务5之前放置尝试。在任务5之前,请记住加入它们。 – HuStmpHrrr 2014-10-29 14:46:13

+0

非常感谢,我会尽力的。 – PhuongHoang 2014-10-29 16:27:56

回答

1

有了这个代码,您可以创建具有优先权的线程通过调用join。线程将被锁定,直到前面的线程完成。请记住,您无法在尚未开始的线程上调用连接。 task1task5是要调用的实际过程(您必须定义的常规过程)。

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

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 " 
+0

这是一个有趣的设置!你开始线程的顺序是显而易见的,合乎逻辑的,但是假设你在1之前开始线程2 - 为什么不行?看来,线程2会阻塞等待线程1完成,不是吗? – 2014-10-29 15:27:19

+0

因为如果你这样做,你会得到一个RuntimeError; – 2014-10-29 15:28:18

+0

您无法加入尚未开始的线程。这样做会引发运行时错误。这就是为什么订单 – 2014-10-29 15:28:51