Python:连续运行主线程,同时在后台运行其他线程

时间:2017-12-25 07:43:37

标签: python multithreading python-3.x python-multithreading

我正在使用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

1 个答案:

答案 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']