我正在尝试通过task_postrun信号中的raisin SystemExit()关闭主芹菜进程。信号被触发就好了,异常会被提升,但工人永远不会完全退出并挂在那里。
我如何使这项工作?
我忘记了某处设置吗?
以下是我正在为worker(worker.py)使用的代码:
from celery import Celery
from celery import signals
app = Celery('tasks',
set_as_current = True,
broker='amqp://guest@localhost//',
backend="mongodb://localhost//",
)
app.config_from_object({
"CELERYD_MAX_TASKS_PER_CHILD": 1,
"CELERYD_POOL": "solo",
"CELERY_SEND_EVENTS": True,
"CELERYD_CONCURRENCY": 1,
"CELERYD_PREFETCH_MULTIPLIER": 1,
})
def shutdown_worker(**kwargs):
print("SHUTTING DOWN WORKER (RAISING SystemExit)")
raise SystemExit()
import tasks
signals.task_postrun.connect(shutdown_worker)
print("STARTING WORKER")
app.worker_main()
print("WORKER EXITED!")
及以下是tasks.py:
的代码from celery import Celery,task
from celery.signals import task_postrun
import time
from celery.task import Task
class Blah(Task):
track_started = True
acks_late = False
def run(config, kwargs):
time.sleep(5)
return "SUCCESS FROM BLAH"
def get_app():
celery = Celery('tasks',
broker='amqp://guest@localhost//',
backend="mongodb://localhost//"
)
return celery
为了测试这个,我要做的第一件事是运行工作程序代码(python worker.py
),然后我排队这样的任务:
>>> import tasks
>>> results = []
>>> results.append(tasks.Blah.delay({}))
我从工人那里看到的输出是:
STARTING WORKER
-------------- celery@hostname v3.0.9 (Chiastic Slide)
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: amqp://guest@localhost:5672//
- ** ---------- . app: tasks:0x26f3050
- ** ---------- . concurrency: 1 (solo)
- ** ---------- . events: ON
- ** ----------
- *** --- * --- [Queues]
-- ******* ---- . celery: exchange:celery(direct) binding:celery
--- ***** -----
[2012-11-06 15:59:16,761: WARNING/MainProcess] celery@hostname has started.
[2012-11-06 15:59:21,785: WARNING/MainProcess] SHUTTING DOWN WORKER (RAISING SystemExit)
我期待python代码从调用返回app.worker_main()
然后打印WORKER EXITED
然后让进程完全退出。这种情况永远不会发生,工作进程必须kill -KILL {PID}
才能消失(它也不能消耗任何其他任务。
我想我的主要问题是:
如何使代码从app.worker_main()
返回?
我希望能够在X
个任务执行完毕后完全重启工作进程(让进程 完全 退出)
更新 我弄清楚了工作人员挂在哪里 - 工作人员(WorkController
)挂在self.stop
之后的电话上捕获SystemExit
例外。
答案 0 :(得分:2)
当我最终回答我自己的问题时,讨厌它。
Anywhoo,它在Mediator
内的WorkController
组件的联接调用中阻塞了(stop()
组件上的Mediator
,内部停靠点{{1} }}为s)。
我通过禁用所有速率限制来摆脱join
组件(默认情况下应该这样,但不是出于某种原因)。
您可以使用以下设置禁用所有速率限制:
Mediator
希望这也有助于其他人。
和平