我想在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 :(得分:2)
我不知道CPU强烈的语音识别是怎样的,但我很确定你所描述的问题最好通过实体之间的最大解耦来解决,即进程中的分离。简单的场景:您的一个进程运行您的主程序",另一个进程完全负责语音识别。然后,您可以在这些进程之间实现通信协议。 "主程序"仍然需要基于threading
的某种事件系统和异步执行,因为它需要能够监听并立即对语音重发过程发送的事件作出反应。因此,工作模型将包含:
multiprocessing
生成,处理语音识别主进程和子进程按操作系统的计划同时运行。当然,这在具有至少两个CPU核心的系统上最有效。在主进程中,主线程和其他线程没有真正同步运行 - 由于CPython的全局解释器锁定(GIL),一次只能运行一个线程。
主要流程与子流程之间的沟通可以使用multiprocessing
或Queue
等基本Pipe
工具实施。
如你所知,你需要对这样的问题投入一些认真思考。不要尝试解决这个快速和肮脏的问题,或者只是通过反复试验来解决这个问题。您需要确保了解自己开发的架构。
答案 1 :(得分:0)
只需使用线程并将线程传递给函数句柄,以便在数据就绪时调用,或者在GUI应用程序中传递应用程序句柄,以便线程可以创建附加数据的事件。