2011-02-23 54 views
1

我有一些用python編寫的腳本。 我想多線程他們。多線程不同的腳本

腳本A啓動時。我想要腳本B,C和D啓動。 A運行後,我會運行A2。 B運行後,我會B2運行,然後B3。 C和D沒有後續腳本。

我檢查過腳本是相互獨立的。
我打算使用"exec"發動他們,並想在Linux和Windows使用「啓動器」。」

我有其他的多線程腳本主要做的過程的五個線程。這扔我,因爲所有過程是不同的,但可以啓動,並在同一時間運行

+1

問題是什麼? 我個人根本不會使用exec,只是將所有腳本鏈接在一起並使用多處理庫,但exec方法也應該可以正常工作。 – Voo 2011-02-23 15:56:55

+0

我不知道如何設置。 – Merlin 2011-02-23 16:15:49

回答

2

好吧,我真不知道哪兒你的問題,但是這就是我想要解決這個問題的方式:

#Main.py 
from multiprocessing import Process 
import ScriptA 
# import all other scripts as well 

def handle_script_a(*args): 
    print("Call one or several functions from Script A or calculate some stuff beforehand") 
    ScriptA.foo(*args) 

if __name__ == '__main__': 
    p = Process(target=handle_script_a, args=("Either so",)) 
    p1 = Process(target=ScriptA.foo, args=("or so",)) 
    p.start() 
    p1.start() 
    p.join() 
    p1.join() 

# ScriptA.py: 
def foo(*args): 
    print("Function foo called with args:") 
    for arg in args: 
     print(arg) 

你可以要麼直接調用函數,要麼在一個pr中調用多個函數請使用小包裝紙。沒有平臺相關的代碼,沒有醜陋的執行者,你可以用任何方式輕鬆創建/加入過程。

和進程間通信隊列中的一個小例子 - 從Python API,但還有相當多被盜;)

from multiprocessing import Process, Queue 

def f(q): 
    q.put([42, None, 'hello']) 

if __name__ == '__main__': 
    q = Queue() 
    p = Process(target=f, args=(q,)) 
    p.start() 
    print(q.get()) # prints "[42, None, 'hello']" 
    p.join() 

創建隊列,並給它一個或多個進程。注意,get()塊,如果你想要非阻塞,你可以使用get_nowait()或者指定超時作爲第二個參數。如果你想共享對象,那麼會有多處理。數組或多處理。值,只需閱讀文檔以獲取特定信息。doc link 如果你有更多關於IPC的問題,請創建一個新問題 - 本身就是一個非常大的話題。

+0

這就是多進程。如何改變多線程。過去我沒有使用導入腳本。好主意! – Merlin 2011-02-23 16:31:47

+0

我會添加ScriptA2和ScriptB,ScriptB2,在哪裏?假設存在。 – Merlin 2011-02-23 16:34:01

+0

那麼多處理庫與線程庫幾乎是可以互換的,但是如果你想讓它們真正並行運行,你不應該使用線程(至少在CPython中查找全局解釋器鎖來獲取細節)。由於您不需要在進程之間進行通信,程序也不會變得更復雜(如果需要,多處理程序包中有管道和隊列實現)。 而你只是像ScriptA一樣導入它們。 – Voo 2011-02-23 16:35:43

0

因此,它不一定是一個Python發射器?當我在做大量的系統管理員時,我使用POE框架編寫了一個Perl腳本來運行腳本或任何具有有限併發性的腳本。工作很好。例如,當我們不得不在一千個用戶帳戶或幾百個數據庫上運行腳本時。將其限制在4-cpu機箱上,一次只能處理4個作業,在16路服務器上處理16個作業或任意數量。 POE確實使用fork()來創建子過程,但在Windows下,在cygwin,FWIW下工作正常。

後來我一直在尋找Python的等價事件框架。今天再次看到我看到扭曲 - 一些帖子表明它運行速度比POE更快 - 但也許扭曲主要是網絡客戶端/服務器? POE的令人難以置信的靈活性。起初如果你不習慣事件驅動的腳本,即使你是事實,但事件比線程更容易成功,這很棘手。 (也許是爲了您的需要而過度使用?多年後,我仍然很驚訝沒有一個簡單的實用程序來控制多CPU機器的吞吐量。)