在 python multiprocessing 中运行进程的自定义终止

Running a custom termination of a process in python multiprocessing

提问人:hammertimeheck 提问时间:11/2/2023 最后编辑:hammertimeheck 更新时间:11/2/2023 访问量:12

问:

可能有一个简单的方法可以做到这一点,但我对 python 比较陌生。从本质上讲,我在不同的文件中有两个函数。一个创建一个新进程来运行另一个进程。但是,在用户按键(回车键)时,我想发送一个信号来终止另一个进程。但是,在终止之前,我希望该进程运行某种保存函数然后终止,因此我不能使用多处理的内置终止。

下面是文件 1 中的示例代码:

import test_global
import msvcrt
import multiprocessing as mp
import time as t

if __name__ == "__main__":
    process = mp.Process(target=test_global.test)
    process.start()
    
    while True:
        #Emergency Stop
        #Detect user key input
        if msvcrt.kbhit():
            #Detect enter key
            if msvcrt.getwche() == '\r':
                #Emergency function stop
                test_global.emergency_stop = True
                print("Emergency Stop Activated")
                print("Clock Stopped")
                break

以及运行进程的文件“test_global”中的示例代码:

import time as t
import datetime as dt

global emergency_stop
emergency_stop = False

def test():
    while True:
        print(f"No input. {dt.datetime.now()}")
        if emergency_stop:
            save()
            print("function stopped")
            break
        t.sleep(1)


def save():
    """
    Do some save things here
    """
    pass

正如你所看到的,为了做到这一点,我尝试编辑test_global的全局变量“emergency_stop”。我曾考虑过使用管道和队列,但是在激活紧急停止之前,主进程将不断需要发送 None。队列是可能的,但随后该过程将需要不断清除它以寻找实际emergency_stop。我可以腌制一个变量并读取所说的腌制,但这似乎也过于复杂,而且有点耗时。

全局变量 python-multiprocessing 终止

评论

0赞 padu 11/14/2023
“曾考虑过使用管道和队列,但随后主进程将不断需要发送 None,直到激活紧急停止。”这不是真的!
0赞 padu 11/14/2023
您不必一直将东西发送到队列中!您需要做的就是在主进程中发送停止信号,并在子进程中读取该信号并停止进程 此外,为此,没有必要使用队列,变量或事件就足够了

答: 暂无答案