延伸多工艺在Python 3中

2024-03-29 13:42:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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类来添加一个shutdown方法,以便能够退出可能需要运行一段未定义时间的函数。按照Python Multiprocessing Exit Elegantly How?的说明并添加传递给我自己的参数,只得到以下输出:

^{pr2}$

但是没有实际的方法f(x)输出。似乎实际的进程目标没有启动。很明显我做错了什么,但就是不知道怎么回事,有什么想法吗?在

谢谢!在


Tags: nameimportselfformattargetdefasexit
1条回答
网友
1楼 · 发布于 2024-03-29 13:42:00

处理这种情况的合理方法是,在可能的情况下,通过定期检查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()

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

相关问题 更多 >