2015-11-05 55 views
0

我正在使用threading.Timer函數一次運行多個計時器。一旦每個時間過後,調用該函數使用子與「說」命令,如下圖所示:檢查當前是否在使用Python的任何線程中運行的子進程

subprocess.call(["say", "hello world"]) 

有時計時器後,對方很快熄滅,然後他們開始討論過對方。我怎樣才能讓他們相互等待,以便它們不重疊?

我仍然希望能夠在發生這種情況時在主程序中做其他事情(比如製作新的計時器),所以我不認爲我可以使用popen.wait()或.join()

回答

1

如果say可執行快速運行,你可以鎖定它的調用:

​​

如果say可執行文件本身很慢,你將不得不存儲它的輸出,僅打印出來(再次,有鎖)在調用結束時:

lock = threading.Lock() 

def your_thread_function(): 
    # You can also use subprocess.check_output. 
    p = subprocess.Popen(["say", "hello world"], stdout=subprocess.PIPE) 
    out, err = p.communicate() 
    with lock: 
     print(out) 
+0

第一個例子完美適用於我的應用程序,謝謝! – bbqed

+0

@bbqed:一般來說,用一個鎖來保護'subprocess.Popen()'是個好主意(它與問題無關,但它避免了多線程和子進程的各種問題(例如,由於平臺錯誤導致的競爭條件) )。 'Popen()'立即返回而不等待子進程完成;因此可以在這裏用鎖來保護它。 – jfs

相關問題