2013-07-27 228 views
1

我想在Python中與主程序並行運行一個函數。假設我有語音識別功能。我希望它能夠在後臺運行,並且在聽到特定話語時中斷主程序。但同時,我還有其他任務要執行。所以,語音識別應該作爲一個單獨的過程來工作,並且可以在聽到命令時調用一個函數。在Python中並行運行函數

我試過蟒蛇多處理模塊,該線程模塊和線程模塊。但所有這些都要求我等待進程或線程完成。我想要的是可以讓我在後臺運行功能的東西。如果發生特定事件,他們必須調用一些回調函數。

我希望我會找到一個這樣做的有效方法。我試過線程模塊。代碼看起來像這樣(僞代碼):

def detected(text): 
    commands = 'a list of commands' 
    if text in commands: 
     #call some function according to the command 

def speech_recognition(): 
    #while True: 
     #If speech detected: 
      #record it 
      #process it and covert it to text 
      #if text is a specified command: 
       #call the detected(text) function with the recognized text as argument 

import threading as t 

pr = t.Thread(target=speech_recognition) 
pr.start() 

#from here starts the main program that does some other functions that 
#doesn't need to be mentioned here. 

但這不起作用。語音識別運行幾秒鐘,然後退出。沒有異常提出,沒有系統退出,什麼也沒有。當我嘗試多處理線程模塊時,它是相同的。

+0

這是什麼意思線程模塊需要你等到線程完成?如果你在一個線程上調用'join()',你只需要等待,但如果你不這樣做,你仍然可以在主線程中做其他的事情。 –

+0

我編輯了這篇文章。看一看。 – freeMinder

回答

0

只需使用線程並將線程傳遞給函數句柄即可在數據就緒時調用,或者在GUI應用程序中使用應用程序句柄,以便線程可以創建附帶數據的事件。

2

我不知道CPU密集型語音識別是如何的,但我很確定你所描述的問題最好是通過實體之間的最大解耦,即分離過程來解決。簡單的場景:你的一個進程運行你的「主程序」,另一個進程完全負責語音識別。然後在這些進程之間實現通信協議。 「主程序」仍然需要基於threading的某種事件系統和異步執行,因爲它需要能夠偵聽並立即對由語音識別過程發送的事件做出反應。因此,工作模式將包含:

  • 一個主處理不應被CPU綁定
  • 一個子進程,經由multiprocessing催生,處理語音識別
  • 的通信協議使數據的發送/主進程和子進程之間的事件
  • 在等待由子進程發送的事件,並確保主程序相應反應
主進程在一個額外的線程

主進程和子進程按照操作系統的計劃同時運行。當然,這對於至少具有兩個CPU內核的系統來說效果最好。在主進程中,主線程和另一個線程不能同步運行 - 由於CPython的全局解釋器鎖定(GIL),一次只能運行一個線程。

主進程和子進程之間的通信可以使用基本的multiprocessing工具來實現,例如QueuePipe

如你所知,你需要對這樣的問題投入一些認真的思考。不要試圖解決這個快速的骯髒或只是通過反覆試驗。你需要確保你瞭解自己開發的架構。