我正在尝试编写一个Python多线程脚本,该脚本在不同的线程中执行以下两件事:
- 父线程:启动子线程,
- 执行一些简单的任务,停止子线程
- 孩子:做一些长时间运行的任务。
下面是一个简单的方法。它对我有用:
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 时终止。
除非要清理子进程,否则无需在此处使用 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