- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是
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 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)
代码的优点是我可以编辑配置文件,并且进程也会重新加载其配置。
问题是只有第一个进程运行而其他进程被忽略。
编辑:这救了我的命,在 schedule() 中使用 while 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()
关于Python 多处理 : Killing a process gracefully,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26627382/
一个观察:当我在 android 上开发我的应用程序时,我注意到 LogCat 中有以下两行。这些发生是因为我自己的应用程序的内存需求太多。我读过 Android 可以决定何时摆脱不需要或由于内存需求
SIGINT有什么区别信号和 SIGTERM信号?我知道SIGINT相当于在键盘上按Ctrl+C,但什么是SIGTERM为了?如果我想优雅地停止一些后台进程,我应该使用哪些? 最佳答案 响应的唯一区别
假设我有一个父进程和一个子进程(以例如 fork() 或 clone() 启动)在 Linux 上运行。进一步假设存在一些父子都可以修改的共享内存。 在父进程的上下文中,我想停止子进程并知道它实际上已
所以我最近了解到 kill is not a synchronous命令,所以我在 bash 中使用这个 while 循环,这很棒: while kill PID_OF_THE_PROCESS 2>/
我遇到了一个问题。我们有一个干净的脚本用来清理旧文件,有时我们需要停止它,稍后再启动它。像下面的过程。我们在check.sh中使用kill -STOP $pid和kill -CONT $pid来控制c
内核中谁负责终止进程。 如果“kill”来了,进程处于阻塞状态怎么办。 kill是否等到进程进入running状态才清理自己。 如果有人可以在内核方面回答更多问题,例如当 kill 命令生成 SIGI
在下面的链接中 http://www.faqs.org/docs/Linux-HOWTO/NFS-HOWTO.html 它说一个进程除非被“sure kill”才能杀死,但是什么是sure kill?
我正在尝试编写一个快速的 bash 脚本,以在脚本检测到的特定条件下向程序发出信号,并且出于习惯,我正在使用某些 bin 实用程序的完整路径,即 /bin/rm 和 /bin/kill 代替 rm 和
我的服务器在端口 80 上运行 nohup。我试试 ps aux | grep nohup 得到 root 9234 0.0 0.1 11740 932 pts/1 S+ 15:19 0:00 gre
我写了下面的脚本,如果 grep 在文件中找不到相关的字符串,它会启用 20 秒的超时。 脚本运行良好,但是脚本的输出是这样的: ./test: line 11: 30039: Killed 如何从
基本上我想要一个 bash 脚本进程,在收到 SIGINT 后,在退出之前杀死它的所有子进程。我读了here使用以下内容: trap "kill -TERM -$$ ; exit 1" INT QUI
我有一个名为 Launcher.sh 的 shell 脚本,它由 java 进程执行。 java进程内部使用ProcessBuilder来执行bash脚本。 在 Launcher.sh 中,我有以下代
上下文 我创建了一个调用 celery 任务的 Django 应用程序,该任务又会生成其他任务并等待它们完成。 工作流程如下: 1) 主要的python/django代码在后台启动一个celery任务
我要输出这条消息/usr/local/ex1.sh: line xxx: Killed ex2.sh >> $LOG_FILE 2>&1到日志文件。 不过 “ex1.sh”输出 /usr/local
我最近上传了很多问题,我认为人们对我感到厌倦,但我不擅长编程,并且正在尝试为 A-level 类(class)编写游戏代码,所以我需要所有可以得到的帮助来学习语言。不管怎样,我将在下面展示一些相关的代
hadoop job -kill job_id 和 yarn application -kill application_id 有什么区别? job_id 和 application_id 是否代表/
在我的 post-command-hook回调,当我这样做时 kill-word , this-command var 是 kill-region - 而不是 kill-word正如预期的那样。 我想
我有一个要在 Oracle Linux OS 上运行的 C++ 应用程序。 考虑一下,我用 new 创建了几个对象。运算符(operator)。虽然我已经使用 delete 操作符来解除分配它,但是
不确定是否相关,但在周末我将我的操作系统升级到 Big Sur 11.1 版,然后当我开始工作时,一件又一件地出错,现在我根本无法使用 node 或 npm。我在 zsh 中收到以下消息: % nod
我使用 python 并行启动两个子进程。一个是 HTTP 服务器,而另一个是另一个程序的执行(CustomSimpleHTTPServer.py,它是由 selenium IDE 插件生成的 pyt
我是一名优秀的程序员,十分优秀!