2011-01-05 72 views
0

在此之前運行多個命令,我在$組運行兩個命令循環,像 爲X: 命令 爲了節省時間,我想運行在同這兩個命令時間,就像在生成文件蟒蛇的同時

由於 林恩

+1

閱讀關於http://docs.python.org/library/threading.html – GWW 2011-01-05 03:03:10

+1

爲什麼不使用'subprocess.Popen()'? – 2011-01-05 03:54:17

回答

3

由於Global Interpreter Lock的原因,線程模塊並不會給您帶來太多的性能。

我認爲最好的方法是使用subprocess模塊並用它自己的stdout打開每個命令。

processes = {} 
for cmd in ['cmd1', 'cmd2', 'cmd3']: 
    p = subprocess.Popen('cmd1', stdout=subprocess.PIPE) 
    processes[p.stdout] = p 

while len(processes): 
    rfds, _, _ = select.select(processes.keys(), [], []) 
    for fd in rfds: 
     process = processses[fd] 
     print fd.read() 

     if process.returncode is not None: 
      print "Process {0} returned with code {1}".format(process.pid, process.returncode) 
      del processes[fd] 

基本上,你必須使用選擇,看看哪個文件描述符準備好,你必須檢查他們的返回碼,看是否做了「讀」使他們退出。進程基本上進入等待狀態,直到他們的標準輸出關閉。如果你想在等待的時候做一些事情,你可以在select.select()上加一個超時時間,這樣你就可以在這麼久之後停止等待。你可以測試rfds的長度,如果它是0,那麼你知道超時發生了。

1

twistedselect模塊可能就是您所追求的。

如果你想要做的是一堆批處理命令,shell腳本,即

#!/bin/sh 
for i in "command1 command2 command3"; do 
    $i & 
done 

可能會更好地工作。或者,像你說的一個Makefile。