我正在使用Python制作虚拟助手。为此,我需要一个连续运行的主线程,这是语音识别所必需的,并希望在检测到语音在后台运行后运行其他线程,如操作。
对于像计时器这样的任务,我希望在主线程运行时让它在后台运行,这样即使在计时器运行时我也可以执行其他任务......到达时间后它应该将它作为tts
返回到main线
我正在使用的当前结构是
main.py
- > class Main()
- > Running logger in background // which is meant to exit with mainLoop
- > and Command() loop for speech recognition continuously
- >`链接到Brain.py到timer.py
关于multithreading
与multiprocessing
的几句话:
在多线程中,您可以在当前进程中启动一个线程。 Python以短序列顺序运行(通过global interpreter lock)线程,从不真正并行。好处是线程可以访问相同的变量(即共享内存)。
在多处理的另一方面,您运行一个新进程(在OS中它显示为一个单独的程序)。它们可以真正并行运行,但共享变量要复杂得多(而且速度要慢得多)。
对于您的用例,似乎没有两个东西是“CPU绑定”,即不会出现两个事情需要CPU同时100%的情况。在这种情况下,多线程可能是更好的解决方案,那就是你应该选择James Lim的解决方案。
如果您仍想进行多处理,则以下代码可能是计时器的基本设置。对于语音识别功能,它将是相应的(特别是关于返回列表的部分应该足以从语音识别返回tts):
import multiprocessing
import time
def timer_with_return(seconds, return_list):
time.sleep(seconds)
return_list.append('foo')
if __name__ == "__main__":
# variables by manager are shared among process
# e.g. for return values
manager = multiprocessing.Manager()
timer_return = manager.list()
timer = multiprocessing.Process(target=timer_with_return, args=(3, timer_return))
timer.start()
while True:
time.sleep(1)
if not timer.is_alive():
break
print("timer is still running")
timer.join() # make sure the process is really finished
print("timer finished, return value is {}".format(timer_return))
运行它会产生:
timer is still running
timer is still running
timer is still running
timer finished, return value is ['foo']