2014-10-29 36 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