python3杀死进程_Python多处理:优雅地杀死进程

是否

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()

优雅地杀死一系列进程?

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

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

编辑:添加了更多代码来解释我正在运行一段时间的True循环

编辑:这是@dano suggestion之后的新代码

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)

关于代码的好处是,我可以编辑配置文件,并且进程也将重新加载其配置.

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

编辑:这节省了我的生命,使用while而schedule()不是一个好主意,所以我设置了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()

解决方法:

如果您不介意只有在工作人员完成所有工作后才中止,那么添加一个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()

标签:python,linux,multiprocessing,python-multiprocessing

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值