我正在使用Celery和Django进行在线游戏。
基于这个答案,我已经编写了中间件来检查Celery是否可用并正在运行:Detect whether Celery is Available/Running
我的代码实际上是这样的:
from celery.task.control import inspect
class CeleryCheckMiddleware(object):
def process_request(self, request):
insp = inspect().stats()
if not insp:
return render(...)
else:
return None
但我忘记了答案底部评论中的警告,'我发现上面每次运行时都会向rabbitmq添加两个reply.celery.pidbox队列。这导致rabbitmq的内存使用量逐渐增加。'
我现在(仅一天之后!)注意到从insp = inspect().stats()
行开始并以OSError: [Errno 4] Interrupted system call
结尾偶尔会出现500个错误。
是否有内存安全的方法来检查Celery是否可用且正在运行?
答案 0 :(得分:1)
这感觉非常沉重。您可能最好运行异步任务并以可接受的超时收集结果。这很天真,但它不应该对资源产生太大的影响,这取决于你需要多久调用一次......
@app.job
def celery_alive():
return "OK"
def process_request(self, request):
res = celery_alive.apply_async()
try:
return "OK" == res.get(timeout=settings.ACCEPTABLE_TRANSACTION_TIME)
except TimeoutError as e:
return False
答案 1 :(得分:0)
以下脚本适用于我。
#Import the celery app from project
from application_package import app as celery_app
def get_celery_worker_status():
insp = celery_app.control.inspect()
nodes = insp.stats()
if not nodes:
raise Exception("celery is not running.")
logger.error("celery workers are: {}".format(nodes))
return nodes