是否

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

python3杀死进程_Python多处理:优雅地杀死进程相关推荐

  1. java 进程撤销_2020-08-12 如何优雅关闭java进程

    kill -l可以看到信号列表 列表 kill -9 pid 可以直接杀死pid的进程,不过这种方式太暴力了.可能会出现: 请求丢失:内存队列中等待执行请求丢失 数据丢失:处于内存缓存中数据未持久化到 ...

  2. python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程

    一.python如何使用多进程 创建子进程的方式 1.导入multiprocessing 中的Process类 实例化这个类 指定要执行的任务 target import os from multip ...

  3. 【k8s】理解Docker容器的进程管理(PID1进程(容器内kill命令无法杀死)、进程信号处理、僵尸进程)

    文章目录 概述 1. 容器的PID namespace(名空间) 2. 如何指明容器PID1进程 3. 进程信号处理 4. 孤儿进程与僵尸进程管理 5. 进程监控 6. 总结 参考 概述 简介: Do ...

  4. python获取进程编号(目的、获取当前进程编号、根据编号杀死指定进程号、获取当前父进程编号)

    1. 获取进程编号的目的         获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的. 获取进程编号的两种操作 获取当前进程编号 获取当前父进程编号 2. 获 ...

  5. linux中杀死指定进程,Linux中通过 kill命令 杀死指定进程

    一  杀死指定进程 现知道有一个curl线程正在运行,需要杀死 anggang@barry$ curl -y 30 -Y 1 -m 300 -x 8.8.8.8:808 -o html_baidu h ...

  6. python关闭excel进程_python win32com关闭Excel进程

    试图通过python改变Excel_sheet,并完全混淆进程恢复.python win32com关闭Excel进程 import win32com.client class XlsClass: de ...

  7. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  8. 守护进程方式保证App不被杀死

    思路 linux进程中用到的方法 代码 1 linux进程部分 2 App部分 3 Androidmk部分 转载请注明链接 因为Android的内存管理机制,当系统内存紧张时,App如果运行在后台,容 ...

  9. Golang信号处理和优雅退出守护进程

    Golang中的信号处理 信号类型 个平台的信号定义或许有些不同.下面列出了POSIX中定义的信号. Linux 使用34-64信号用作实时系统中. 命令 man signal 提供了官方的信号介绍. ...

最新文章

  1. 大数据-spark-hbase-hive等学习视频资料
  2. linux缓存限制,如何限制复制使用的缓存,以便仍有其他缓存可用的内存?_linux_开发99编程知识库...
  3. LockSupport 使用
  4. 详解虚函数的实现过程之菱形继承(5)
  5. [转]使用target_system进行erlang应用的发行
  6. el表达式 if 和 if else 的写法
  7. Java静态方法与非静态方法的泛型
  8. mysql中常见错误代码汇总
  9. springboot2.0新特性
  10. Dart集成开发环境
  11. mysql数据库复制数据表时的风险
  12. oracle PL/SQL(procedure language/SQL)程序设计之异常(exception)
  13. bt php,bt.php · jiehu0992/家谱familytree - Gitee.com
  14. C++面向对象课程设计实例-图书馆借阅系统
  15. windows系统镜像修复计算机,分享win10用镜像文件修复系统的方法
  16. mysql删除一行_MySql删除表中一行的实操方法
  17. 大数据技术怎么自学?大数据开发如何自学?
  18. 学习第1天:认识Linux系统和红帽认证
  19. 硼碳氮纳米管的制备(碳纳米管包裹磁性金属复合纳米结构/多孔氧化物掺杂的碳纳米管包裹的碳纳米球/碳氮纳米管包裹纳米金属粒子/碳纳米管包裹Ni纳米线复合材料)
  20. 图片数据损坏了怎么恢复

热门文章

  1. 2021-12-13 股票模拟交易心得8
  2. 运用matlab分析圆周运动,圆周运动下移动火源扩散火焰的图像特性分析
  3. NER中的一些编码器与解码器
  4. ESP32-C3入门教程 网络 篇(二、 Wi-Fi 配网 — Smart_config方式 和 BlueIF方式)
  5. linux中sz命令怎么使用,Linux 下sz/rz(lsz/lrz)的使用
  6. PHPSTORM 破解
  7. RealMedia文件格式
  8. [附源码]java毕业设计面向企业人力资源管理网上智能考勤系统
  9. 数据结构-二叉树和堆的实现
  10. 在工作与生活中保持情绪稳定的艺术