Python:运行 主线程连续运行,而 运行 其他线程在后台
Python: Running main thread continuously and while running others in background
我正在使用 Python 制作虚拟助手。
为此,我需要一个主线程 运行ning 连续进行,这是语音识别所必需的,并且希望 运行 其他线程在后台检测到 运行 语音后采取行动。
对于计时器之类的任务,我想在主线程运行ning时在后台进行运行ning,这样即使计时器为[=]我也可以执行其他任务30=]ning... 到达时间后它应该 return 它作为 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
关于 multithreading
与 multiprocessing
的几句话:
在多线程中,您在当前进程中启动一个线程。 Python 运行s(通过 global interpreter lock)线程以短顺序排列,从不真正并行。好处是线程可以访问相同的变量(即共享内存)。
另一方面,在 multiprocessing 中,您 运行 一个新进程(在 OS 中它显示为一个单独的程序)。他们确实可以 运行 并行但是共享变量要棘手得多(也慢得多)。
对于您的用例,似乎没有两件事是 "CPU bound",即不会有两件事同时需要 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']
我正在使用 Python 制作虚拟助手。 为此,我需要一个主线程 运行ning 连续进行,这是语音识别所必需的,并且希望 运行 其他线程在后台检测到 运行 语音后采取行动。
对于计时器之类的任务,我想在主线程运行ning时在后台进行运行ning,这样即使计时器为[=]我也可以执行其他任务30=]ning... 到达时间后它应该 return 它作为 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
关于 multithreading
与 multiprocessing
的几句话:
在多线程中,您在当前进程中启动一个线程。 Python 运行s(通过 global interpreter lock)线程以短顺序排列,从不真正并行。好处是线程可以访问相同的变量(即共享内存)。
另一方面,在 multiprocessing 中,您 运行 一个新进程(在 OS 中它显示为一个单独的程序)。他们确实可以 运行 并行但是共享变量要棘手得多(也慢得多)。
对于您的用例,似乎没有两件事是 "CPU bound",即不会有两件事同时需要 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']