我将 celeryd 和 celerybeat 设置为守护进程,它们工作了不久。但从一段时间以来,它不会启动工作程序,也不会创建 pid 文件。
这是我的/etc/default/celeryd:
# Name of nodes to start
CELERYD_NODES="w1 w2 w3 w4 w5 w6 w7 w8"
# Extra arguments to celeryd
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Where to chdir at start.
CELERYD_CHDIR="/srv/www/web-system/myproject"
# %n will be replaced with the nodename.
#CELERYD_LOG_FILE="/var/log/celery/%n.log"
#CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/srv/www/web-system/logs/celery/%n.log"
CELERYD_PID_FILE="/srv/www/web-system/pids/celery/%n.pid"
# Log level to use for celeryd. Default is INFO.
CELERYD_LOG_LEVEL="INFO"
# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$CELERYD_CHDIR/manage.py celeryd_multi"
# How to call "manage.py celeryctl"
CELERYCTL="$CELERYD_CHDIR/manage.py celeryctl"
# Workers should …Run Code Online (Sandbox Code Playgroud) 我让芹菜与 django-celery 一起运行,基本上我无法弄清楚为什么芹菜工人在任务停止后保留内存?
是否有可以在特定任务结束时释放内存的参数?
我正在运行 Celery 3.1.16 和 rabbitmq 作为代理。
来自 ps 辅助:
1000 6411 0.3 3.8 117288 39564 pts/0 S+ 12:44 0:00 /usr/bin/python /usr/local/bin/celery -A Website3 worker -l info
1000 6454 6.7 6.1 143660 62760 pts/0 S+ 12:44 0:12 /usr/bin/python /usr/local/bin/celery -A Website3 worker -l info
Run Code Online (Sandbox Code Playgroud)
数据保持这样,直到我杀死工人并重新启动它。
有没有可以设置释放内存的参数?
我正在遵循本指南:http : //docs.celeryproject.org/en/latest/django/first-steps-with-django.html
我的 proj.celery 文件:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hc.settings')
app = Celery('hc')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task
def debug_task(a):
print a
app.conf.beat_schedule = {
# Executes every Monday morning at 7:30 a.m.
'debug-every-minute': {
'task': 'tasks.debug_task',
'schedule': crontab(),
'args': ("BLa BLA BlA", ),
},
}
Run Code Online (Sandbox Code Playgroud)
另外,我已将定期任务添加到 /admin/django_celery_beat/
我知道app.conf.beat_schedule在 admin 中同时使用和 period_task是没有意义的,但我没有看到预期的条目
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Run Code Online (Sandbox Code Playgroud)
(我希望 Bla bla …
我正在用这个扯掉我的头发。
我的问题的症结在于,CELERY_DEFAULT_QUEUE在我的 Django设置中使用settings.py我的任务不会强制我的任务进入我设置的特定队列。它总是进入celery我的经纪人的默认队列。
但是,如果我queue=proj:dev在shared_task装饰器中指定,它会进入正确的队列。它的行为符合预期。
我的设置如下:
.delay()通过 Django 的 shell ( manage.py shell)执行任务注意:对于下面的代码片段,我隐藏了项目名称并用作proj占位符。
celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery, shared_task
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY', force=True)
app.autodiscover_tasks()
@shared_task
def add(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
settings.py
...
CELERY_RESULT_BACKEND = …Run Code Online (Sandbox Code Playgroud) 我写了一个 Django 项目,它通过my_task.delay(). 问题是随着项目越来越大,正确路由任务真的很困难 - 我开始编写任务的唯一目的是组合不同的任务,这使得一段时间后代码变得混乱。
当我阅读一些 RabbitMQ 文档时,我找到了一个解决方案,它可以更好地构建我的项目,它依赖于Exchanges。Exchange可以将消息发布到Cosumer可以在其上消费它的多个队列,简而言之:

所述的RabbitMQ-文档描述了与鼠兔的溶液,其是用于RabbitMQ的比芹菜更低水平的客户端。
芹菜,文档描述了此方案在其文档,但没有说明如何创建一个生产者产生的消息被发送到一个交易所就其分配到不同的队列如上面图片中看到。它只描述了如何向队列发送消息和发送任务- 但我希望由 Exchange 处理。
我发现 celery 所依赖的 Kombu 具有通过生产者将消息发送到 Exchange 的功能,但我找不到任何有关如何在 celery-django 中使用它的文档。
我如何能够在芹菜中归档所描述的程序?
PS:在 StackOverflow 上已经有一个类似的问题,它建议使用像 Chain 和 Group of Celery 这样的原语,但这与我理解的 Exchange 范式相矛盾。
我正在使用 django-celery-results 扩展并成功地将记录保存在 db 后端表中celery_results_taskresults。我的任务与模型实例相关联,我希望能够在视图和最终模板中将它们作为每个实例的属性列出。我可以在管理界面中看到它们,但无法弄清楚如何在列表中访问它们。
我虽然在有问题的模型上创建了一个@property,使用原始 sql,但是我看到的 sql 示例都引用了一个模型,如果有一个 celery_results_taskresults 模型,我找不到它。
我已按照https://pythad.github.io/articles/2016-12/how-to-run-celery-as-a-daemon-in-production 中的说明操作 它对 celeryd 运行良好,但是在启动 celerybeat 时说找不到pid文件。
我在我以前的项目中使用了本教程,它对 celeryd 和 celerybeat 都很好。该项目的不同之处仅在于包括 django 项目在内的所有项目文件都归 root 所有。我未能找到有关该问题的更多详细信息。
我正在尝试在 Django 中使用 celery 执行任务。我想在每天中午 12:30 执行该任务,我已将其写入到我的tasks.py中
@periodic_task(run_every=crontab(minute=30, hour=12), name="elast")
def elast():
do something
Run Code Online (Sandbox Code Playgroud)
这不起作用,但如果我想每 30 秒安排一次,我就编写这段代码
@periodic_task(run_every=(timedelta(seconds=30)), name="elast")
def elast():
do something
Run Code Online (Sandbox Code Playgroud)
这有效。我想知道第一段代码有什么问题?任何帮助将不胜感激。
我CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"在 django 项目设置文件中进行了设置。但它似乎不起作用。
我检查了 celerybeat 日志,发现 celerybeat 调度程序是celery.beat.PersistentScheduler. 我只能在 celery 节拍启动文件 ( celery -A config beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler) 中将节拍调度程序设置为“DatabaseScheduler”。
如何在 django 设置文件中设置调度程序?我不想在 celerybeat 启动命令中设置调度程序。
芹菜版本号:4.4.5
我有一个像这样装饰的函数:
@app.task(bind=True, retry_backoff=5, retry_jitter=False, retry_kwargs={"max_retries": 5})
def foo(self):
try:
#work
except Exception:
try:
_log.info(retrying task)
self.retry()
except MaxRetriesExceeded:
_log.error(Permanent failure)
Run Code Online (Sandbox Code Playgroud)
我希望在 5 秒后重试,然后在 10 秒后重试,然后在 20 秒后重试,然后在 40 秒后重试,然后在 80 秒后重试。
相反,celery 会记录“180 秒后重试任务”,它确实这样做了。然后,它重复相同的过程两次,总共重试三次,然后放弃。
从我在文档中读到的内容来看,这似乎是正确的方法。难道我做错了什么?
django-celery ×10
celery ×9
django ×9
python ×3
celery-task ×1
celerybeat ×1
daemons ×1
rabbitmq ×1