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.

但这不起作用。语音识别运行几秒钟,然后退出。没有引发异常,没有系统退出,什么都没有。当我尝试多处理线程模块时,它是一样的。

4

2 回答 2

2

我不知道 CPU 密集型语音识别如何,但我很确定您所描述的问题最好通过实体之间的最大解耦来解决,即进程分离。简单场景:您的一个进程运行您的“主程序”,另一个进程完全负责语音识别。然后,您在这些进程之间实现通信协议。“主程序”仍然需要某种事件系统和基于 的异步执行threading,因为它需要能够监听并立即响应语音识别进程发送的事件。因此,一个工作模型将包含:

  • 一个不应受 CPU 限制的主要进程
  • 一个子进程,通过multiprocessing处理语音识别产生
  • 一种通信协议,能够在主进程和子进程之间传输数据/事件
  • 主进程中的一个附加线程,它等待子进程发送的事件并确保主程序做出相应的反应

主进程和子进程按照操作系统的调度同时运行。当然,这在具有至少两个 CPU 内核的系统上效果最好。在主进程中,主线程和另一个线程并没有真正同步运行——由于 CPython 的全局解释器锁 (GIL),一次只能运行一个线程。

主进程和子进程之间的通信可以用或multiprocessing等基本工具来实现。QueuePipe

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

于 2013-07-27T14:03:23.757 回答
0

只需使用线程并在线程准备好数据时将要调用的函数句柄或在 GUI 应用程序情况下的应用程序句柄传递给您的线程,以便线程可以创建带有附加数据的事件。

于 2013-07-27T13:57:49.647 回答