【问题标题】:Running Python multi-threaded process & interrupt a child thread with a signal运行 Python 多线程进程并用信号中断子线程
【发布时间】:2016-02-03 05:37:54
【问题描述】:

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

  1. 父级:启动子线程,做一些简单的任务,停止子线程
  2. 孩子:做一些长时间运行的任务。

下面是一个简单的方法。它对我有用:

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 的值。那么我怎样才能告诉我的子进程在我想要的时候结束呢?

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

【问题讨论】:

    标签: python multithreading


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2017-05-31
      • 2021-07-16
      • 2019-03-09
      • 2015-01-04
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2020-09-17
      • 2018-09-27
      相关资源
      最近更新 更多