扩展MP.Python 3 中的进程


import multiprocessing as mp
import time as t
class MyProcess(mp.Process):
    def __init__(self, target, args, name):
        mp.Process.__init__(self, target=target, args=args)
        self.exit = mp.Event()
        self.name = name
        print("{0} initiated".format(self.name))
    def run(self):
        while not self.exit.is_set():
            pass
        print("Process {0} exited.".format(self.name))
    def shutdown(self):
        print("Shutdown initiated for {0}.".format(self.name))
        self.exit.set()
def f(x):
    while True:
        print(x)
        x = x+1
if __name__ == "__main__":
    p = MyProcess(target=f, args=[3], name="function")
    p.start()
    #p.join()
    t.wait(2)
    p.shutdown()

我正在尝试扩展 multiprocessing.Process 类以添加关闭方法,以便能够退出可能必须运行未定义时间的函数。按照 Python 多处理中的说明优雅地退出如何?并添加我自己想出的参数传递,只会得到我的输出:

function initiated
Shutdown initiated for function.
Process function exited.

但是没有实际的方法f(x)输出。实际的过程目标似乎没有开始。我明明做错了什么,却就是想不通,有什么想法吗?

谢谢!

处理这种情况的理智方法是,在可能的情况下,通过定期检查exit事件,让后台任务在退出机制中合作。为此,无需子类Process:您可以重写后台任务以包含该检查。例如,下面是使用该方法重写的代码:

import multiprocessing as mp
import time as t
def f(x, exit_event):
    while not exit_event.is_set():
        print(x)
        x = x+1
    print("Exiting")
if __name__ == "__main__":
    exit_event = mp.Event()
    p = mp.Process(target=f, args=(3, exit_event), name="function")
    p.start()
    t.sleep(2)
    exit_event.set()
    p.join()

如果这不是一个选项(例如,因为无法修改在后台作业中运行的代码),则可以使用 Process.terminate 方法。但您应该知道,使用它很危险:子进程将没有机会正确清理,因此,例如,如果在持有多进程锁时关闭,则没有其他进程能够获取该锁,从而存在死锁的风险。如果可能的话,让孩子在关闭时合作要好得多。

此问题的解决方案是在类运行方法中调用 super().run() 函数。

当然,由于存在while True,这会导致函数永久执行,并且指定的事件不会导致其结束。

您可以使用Process.terminate()方法来结束您的进程。

import multiprocessing as mp
import time as t
   
   
class MyProcess(mp.Process):
    def __init__(self, target, args, name):
        mp.Process.__init__(self, target=target, args=args)
        self.name = name
        print("{0} initiated".format(self.name))
    def run(self):
        print("Process {0} started.".format(self.name))
        super().run()
    def shutdown(self):
        print("Shutdown initiated for {0}.".format(self.name))
        self.terminate()
   
   
def f(x):
    while True:
        print(x)
        t.sleep(1)
        x += 1

if __name__ == "__main__":
    p = MyProcess(target=f, args=(3,), name="function")
    p.start()
    # p.join()
    t.sleep(5)
    p.shutdown()

相关内容

  • 没有找到相关文章

最新更新