运行Python多线程进程&用信号中断子线程

时间:2016-02-03 05:37:54

标签: python multithreading

我正在尝试编写一个Python多线程脚本,它在不同的线程中完成以下两件事:

  1. 父级:启动子线程,执行一些简单的任务,停止子线程
  2. 孩子:做一些长期任务。
  3. 以下是一种简单的方法。它适用于我:

    from multiprocessing import Process
    import time
    
    def child_func():
        while not stop_thread:
            time.sleep(1)
    
    if __name__ == '__main__':
        child_thread = Process(target=child_func)
        stop_thread = False
        child_thread.start()
        time.sleep(3)
        stop_thread = True
        child_thread.join()
    

    但是出现并发症是因为实际上,而不是child_func()中的while循环,我需要运行一个长时间运行的进程,除非被Ctrl-C杀死,否则它不会停止。所以我无法定期检查stop_thread的值。那么我怎么能告诉我的孩子过程在我想要的时候结束呢?

    我相信答案与使用信号有关。但我还没有看到如何在这种情况下使用它们的好例子。有人可以通过修改上面的代码来帮助使用信号在Child和Parent线程之间进行通信。如果用户按Ctrl-C,则使子线程终止。

1 个答案:

答案 0 :(得分:1)

除非您想要对子进程进行清理,否则无需在此处使用signal模块。可以使用terminate方法停止任何子进程(与SIGTERM具有相同的效果)

from multiprocessing import Process
import time

def child_func():
    time.sleep(1000)

if __name__ == '__main__':
    event = Event()
    child_thread = Process(target=child_func)
    child_thread.start()
    time.sleep(3)
    child_thread.terminate()
    child_thread.join()

文档在这里:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.terminate