2010-11-08 111 views
3

對不起,如果這是一個愚蠢的問題。我嘗試使用多個多線程類來完成不同的工作,這涉及多次在不同時間調用這些多線程。但我不確定使用哪種方法。代碼如下所示:如何在Python中多次調用線程?

class workers1(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

class workers2(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

class workers3(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
    def run(self): 
     do some stuff 

WorkerList1=[workers1(i) for i in range(X)] 
WorkerList2=[workers2(i) for i in range(XX)] 
WorkerList2=[workers3(i) for i in range(XXX)] 


while True: 
    for thread in WorkerList1: 
     thread.run (start? join? or?) 
    for thread in WorkerList2: 
      thread.run (start? join? or?) 
    for thread in WorkerList3: 
      thread.run (start? join? or?) 
    do sth . 

我想在所有的WorkerList所有線程開始在同一時間運行,或至少大約在同一時間開始。一旦它們全部終止後,我想再次調用所有線程。

如果沒有循環,我可以使用.start;但由於我只能啓動一次線程,所以顯然不適合這裏。如果我使用run,似乎所有線程都按順序啓動,不僅是同一列表中的線程,還有來自不同列表的線程。

任何人都可以請幫忙嗎?

回答

8

有很多誤解的位置:

  • 你只能啓動一個線程的特定實例一次。但在你的情況下,for循環正在循環一個線程的不同實例,每個實例都分配給循環中的變量thread,所以在調用每個線程上的start()方法時完全沒有問題。 (你可以把它看成如果變量thread是在列表中實例化的Thread()對象的別名)

  • run()不如join()一樣:調用run()執行,如果你是按順序編程。 run()方法不會啓動一個新的線程,它只是執行方法中的語句,就像其他任何函數調用一樣。

  • join()不啓動執行任何的:它只是等待線程完成。爲了使join()能夠正常工作,您必須先在該線程上調用start()

此外,您不應該在完成執行後無法重新啓動線程:您必須重新創建線程對象才能重新啓動它。解決此問題的一個解決方法是在run()方法的末尾調用Thread.__init__()。然而,我不會推薦這樣做,因爲這將不允許使用join()方法來檢測線程的執行結束。

+0

但我使用的start()方法中的循環,我的程序實際上可以給我一個運行時錯誤,說線程已經啓動。所以我不能再次在每個線程中調用run方法。 – user500432 2010-11-08 08:54:14

+0

對,我編輯了我的答案... – 2010-11-08 09:13:36

1

如果你想在循環調用thread.start(),你真正開始每個線程只有一次,因爲在你的列表中的所有條目是不同的線程對象(也不要緊,他們屬於同一類)。你不應該直接調用線程的run()方法 - 它的意思是由start()方法調用。直接調用它不會在單獨的線程中調用它。

+0

如果我的線程已經啓動並執行完畢,我怎麼能再次調用線程中嵌入的run方法?我的意思是多次調用每個線程中的run方法 – user500432 2010-11-08 08:57:36

+0

每個線程的'run()'方法只調用一次。在'run()'中寫一個循環,或者使用['queue'](http://docs.python.org/library/queue.html)模塊使用一些生產者 - 消費者模式。 – 2010-11-08 09:04:25

相關問題