我正在使用Python制作虚拟助手。 为此,我需要一个连续运行的主线程,这是语音识别所必需的,并希望在检测到语音在后台运行后运行其他线程,如操作。
对于像计时器这样的任务,我希望在主线程运行时让它在后台运行,这样我即使在计时器运行时也可以执行其他任务......并且在到达时间后它应该将其返回为tts
到主线程
当前使用的结构是
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
答案 0 :(得分:0)
关于multithreading
vs multiprocessing
的几句话:
在多线程中,您可以在当前进程中启动一个线程。 Python以短序列顺序运行(通过global interpreter lock)线程,而不是真正并行运行。好处是线程可以访问相同的变量(即共享内存)。
在多处理的另一端,您运行一个新进程(在操作系统中它显示为一个单独的程序)。它们可以真正并行运行,但共享变量要复杂得多(而且速度要慢得多)。
对于您的用例,似乎没有两个东西是" CPU绑定"即两个东西不会同时需要100%的CPU。在这种情况下,多线程可能是更好的解决方案,那就是你应该选择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']