在Python中并行运行函数

时间:2013-07-27 13:43:02

标签: python function parallel-processing

我想在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.

但这不起作用。语音识别运行几秒钟然后退出。没有例外,没有系统退出,没有。当我尝试多处理线程模块时,情况也一样。

2 个答案:

答案 0 :(得分:2)

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

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

主进程和子进程按操作系统的计划同时运行。当然,这在具有至少两个CPU核心的系统上最有效。在主进程中,主线程和其他线程没有真正同步运行 - 由于CPython的全局解释器锁定(GIL),一次只能运行一个线程。

主要流程与子流程之间的沟通可以使用multiprocessingQueue等基本Pipe工具实施。

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

答案 1 :(得分:0)

只需使用线程并将线程传递给函数句柄,以便在数据就绪时调用,或者在GUI应用程序中传递应用程序句柄,以便线程可以创建附加数据的事件。