Python多处理:优雅地杀死进程

4m1nh4j1

import multiprocessing
import schedule


def worker():
     #do some stuff


def sched(argv):
    schedule.every(0.01).minutes.do(worker)          
    while True:
        schedule.run_pending()


processs = []
..
..
p = multiprocessing.Process(target=sched,args)
..
..
processs.append(p)

for p in processs:
    p.terminate()

优雅地杀死进程列表?

如果不是,最简单的方法是什么?

目标是将配置文件重新加载到内存中,因此我想杀死所有子进程并创建其他子进程,后者将读取新的配置文件。

编辑:添加了更多的代码来说明我正在运行一个while True循环

编辑:这是@dano建议后的新代码

def get_config(self):
        from ConfigParser import SafeConfigParser
..
        return argv

def sched(self, args, event):
#schedule instruction:
        schedule.every(0.01).minutes.do(self.worker,args)
        while not  event.is_set():
                schedule.run_pending()                                                                    

def dispatch_processs(self, conf):
        processs = []
        event = multiprocessing.Event()

        for conf in self.get_config():
                process = multiprocessing.Process(target=self.sched,args=( i for i in conf), kwargs={'event' : event})
                processs.append((process, event)
return processs

def start_process(self, process):
        process.start()

def gracefull_process(self, process):
        process.join()

def main(self):
        while True:
                processs = self.dispatch_processs(self.get_config())
                print ("%s processes running " % len(processs) )

                for process, event in processs:                                                               

                        self.start_process(process)
                        time.sleep(1)
                        event.set()
                        self.gracefull_process(process)

关于代码的好处是,我可以编辑配置文件,并且该过程还将重新加载其配置。

问题是只有第一个进程运行,其他进程被忽略。

编辑:这挽救了我的性命,在schedule()中使用True并不是一个好主意,所以我refresh_time改为设置

def sched(self, args, event):

    schedule.every(0.01).minutes.do(self.worker,args)
    for i in range(refresh_time):
            schedule.run_pending() 
            time.sleep(1)

def start_processs(self, processs):
        for p,event in processs:
                if not p.is_alive():
                        p.start()
                time.sleep(1)
                event.set()

        self.gracefull_processs(processs)

def gracefull_processs(self, processs):
        for p,event in processs:
                p.join()
        processs = self.dispatch_processs(self.get_config())
        self.start_processs(processs)

def main(self):

        while True:
                processs = self.dispatch_processs(self.get_config())

                self.start_processs(processs)
                break
        print ("Reloading function main")
        self.main()
损害

如果您不介意仅在worker完成所有工作后中止,那么添加一个multiprocessing.Event轻松退出的方法非常简单

import multiprocessing
import schedule


def worker():
     #do some stuff

def sched(argv, event=None):
    schedule.every(0.01).minutes.do(worker)          
    while not event.is_set():  # Run until we're told to shut down.
        schedule.run_pending()

processes = []
..
..
event = multiprocessing.Event()
p = multiprocessing.Process(target=sched,args, kwargs={'event' : event})
..
..
processes.append((p, event))

# Tell all processes to shut down
for _, event in processes:
    event.set()

# Now actually wait for them to shut down
for p, _ in processes:
    p.join()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用多处理模块杀死进程?

来自分类Dev

杀死Python多处理池

来自分类Dev

Python多处理:如果父进程被杀死,子进程会挂起吗?

来自分类Dev

如何在Python中使用子进程优雅地杀死OSX应用程序

来自分类Dev

Python多处理进程号

来自分类Dev

python多处理池与进程?

来自分类Dev

如何杀死由多处理模块创建的僵尸进程?

来自分类Dev

Python的多处理池产生新的进程

来自分类Dev

Python /多处理:进程似乎无法启动

来自分类Dev

单个进程的Python多处理速度

来自分类Dev

Python多处理进程未启动

来自分类Dev

无需阻止父进程的Python多处理

来自分类Dev

Python 多处理:进程未启动

来自分类Dev

Python 多处理每个线程的多个进程

来自分类Dev

Python多处理:退出时杀死工作程序

来自分类Dev

Python3多处理终止vs杀死vs关闭

来自分类Dev

Python多处理和子进程的独立性

来自分类Dev

Python多处理-最快的进程终止时返回

来自分类Dev

Python多处理,进程与池之间的差异,数据酸洗

来自分类Dev

在python多处理中从子进程返回大对象

来自分类Dev

Python多处理模块:具有超时的联接进程

来自分类Dev

Python多处理无法在Fedora中创建新进程

来自分类Dev

使用多处理模块在python中控制单独的进程

来自分类Dev

Python的多处理程序中的硬挂子进程

来自分类Dev

Python多处理:添加到子进程中的队列

来自分类Dev

Python多处理,进程与池之间的差异,数据酸洗

来自分类Dev

带有子进程的Python多处理停止工作

来自分类Dev

Python多处理和子进程的独立性

来自分类Dev

Python:在进程池中使用多处理管理器