2013-07-27 229 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

如你所知,你需要对这样的问题投入一些认真的思考。不要试图解决这个快速的肮脏或只是通过反复试验。你需要确保你了解自己开发的架构。