这是一个创建于 1724 天前的主题,其中的信息可能已经有所发展或是发生改变。
因为不熟悉 celery,所以请教下,项目中执行 task 的时候,主进程会启用子进程(worker)去跑 task,在子 worker 内存占用过高的情况下,会被 kill 掉吗,这种情况下主进程是否会收到信号之类的东西,或者有什么设置,能让主进程知道子 worker 被 kill。还有就是我手动 kill 掉一个子 woker,主进程能够知道吗?
第 1 条附言 · 2020-01-16 15:24:32 +08:00
update:是这样的,web 程序在开始任务之前会用 redis 做 key,设置任务状态,然后 task 的每次主动触发任务的时候要先判断 redis 中的 key 的 value。如果是中途子 worker 因为跑异步任务内存过高被 celery 主进程 kill 了,那就没有办法在任务的最后重置 redis 的 key 了。导致想再次触发此 task 会被 block,想知道在 worker 被 kill 的时候有没有方法可以去重置下 key,在 redis 的 key timeout 之前。
5 条回复 • 2020-01-16 19:25:50 +08:00
|
|
1
billlee 2020-01-15 23:30:23 +08:00
1. 主进程知道子进程被 kill. 2. ( Linux 下)内存占用过高的情况下,内核会开始 kill 进程,被 kill 掉的不一定是 worker 进程。但在内核开始 kill 进程之前,你的系统可能已经变得非常慢。所以不要过度使用内存。
|
|
|
2
SpencerCJH 2020-01-16 01:35:20 +08:00
蹲一波=大神答,我以前想用 Celery 做一些事情后来换到 APScheduler 了
|
|
|
3
cz5424 2020-01-16 08:39:51 +08:00 via iPhone
被 kill 之后任务就失败了
|
|
|
4
fxxkgw 2020-01-16 16:12:21 +08:00
这样是否可行:子进程设置 signal 函数捕捉父进程或者内核发送的 kill 信号,捕捉后,设置 redis 里 key 的 value。
|
|
|
5
bxqqq 2020-01-16 19:25:50 +08:00
|