问题标签 [celeryd]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6600 浏览

python - 在一台机器上的 celery worker 之间共享内存区域

我想在 celery 中的工作节点(例如缓存的授权令牌、统计信息等)之间共享少量信息。

如果我在我的任务文件中创建一个全局变量,那么每个工作人员都是唯一的(我的工作人员是进程,并且生命周期为 1 个任务/执行)。

最佳做法是什么?我应该在外部(DB)保存状态,创建一个老式的共享内存(由于 celery 中不同的池实现可能很困难)?

提前致谢!

0 投票
7 回答
15351 浏览

django - 如何在不延迟任务的情况下优雅地重启 Celery

我们使用 Celery 和 Django webapp 来管理离线任务;其中一些任务可以运行长达 120 秒。

每当我们进行任何代码修改时,我们都需要重新启动 Celery 以让它重新加载新的 Python 代码。我们当前的解决方案是向 Celery 主进程发送一个 SIGTERM(kill -s 15 `cat /var/run/celeryd.pid`),然后等待它死亡并重新启动它(python manage.py celeryd --pidfile=/var/run/celeryd.pid [...])。

由于长时间运行的任务,这通常意味着关闭将需要一两分钟,在此期间不会处理任何新任务,从而对当前在站点上的用户造成明显的延迟。我正在寻找一种方法来告诉 Celery 关闭,然后立即启动一个新的 Celery 实例以开始运行新任务。

没用的东西:

  • 发送 SIGHUP 到主进程:这导致 Celery 尝试“重启”,方法是热关机然后重新启动自身。这不仅需要很长时间,甚至不起作用,因为显然新进程在旧进程死亡之前启动,所以新进程抱怨ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)并立即死亡。(这看起来像是 Celery 本身的一个错误;我已经让他们知道了。)
  • 将 SIGTERM 发送到主进程,然后立即启动一个新实例:与 Pidfile 相同的问题。
  • 完全禁用 Pidfile:没有它,我们无法判断 30 个 Celery 进程中的哪一个是需要发送 SIGTERM 的主进程,当我们希望它进行热关机时。我们也没有可靠的方法来检查主进程是否还活着。
0 投票
8 回答
58540 浏览

django - 如何优雅地重启芹菜工人?

在发布新版本以更新工作人员中的代码时,如何优雅地重新启动 celery 工作人员?

编辑: 我打算做的是这样的事情。

  • Worker 正在运行,可能正在上传一个 100 MB 的文件到 S3
  • 一个新的构建来了
  • 工人代码有变化
  • 构建脚本向 Worker(s) 发出信号
  • 使用新代码启动新工作者
  • 完成现有工作退出后收到信号的工人。
0 投票
1 回答
529 浏览

python - 将芹菜与金字塔和 mod_wsgi 一起使用

我已经能够通过使用带有 pserve 的金字塔并运行 pceleryd 来部署测试应用程序(我只是发送一封电子邮件而不会在发送时阻塞)。

但是有一点我不明白:我想用 mod_wsgi 运行我的应用程序,我不明白我是否可以在不必从 shell 运行 pceleryd 的情况下做到这一点,但如果我可以在虚拟主机中做某事配置。

可能吗?如何?

0 投票
1 回答
592 浏览

django - TransactionManagementError 与 Django Celeryd / django-celery 与 sqlite 后端

将 Django 用于在后台执行作业的小型应用程序(主要是 cron 样式,但也有用户启动)。
    免责声明:这是我第一次遇到 celeryd,到目前为止的设置来自文档和示例

我正在使用 Django 1.3、celeryd 2.5、django-celery 2.5.1 和 sqlite3。
我仍处于测试阶段,所以我没有调用真正的任务,而只是打印出消息。

我有一个 cron 风格的任务:

另一个将由用户发起的任务:

cron 风格的任务每天只运行一次,而另一个会少量执行
    (平均每天 0 到 30 次)

我使用 sqlite 作为我的后端,我的 celery 设置是:

我遇到的问题不应该发生,但会因为它可以发生,如果用户启动的任务user_task被快速连续调用几次 celery 会关闭以下内容:

Unrecoverable error: TransactionManagementError('Transaction managed block ended with pending COMMIT/ROLLBACK',)
在堆栈的下方
TransactionManagementError("Transaction managed block ended with " TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

根据celerd docs,使用 django-celery w/sqlite 我一次只能处理一个任务,这非常适合我的情况,但似乎多个任务相互叠加。

我已将并发级别设置为 1,将池限制设置为 None,以尝试提供帮助,但我仍然遇到相同的错误。

我在这里缺少芹菜的东西吗?做错了什么?有没有更好的方法来完成我想要完成的事情?

0 投票
3 回答
781 浏览

python - 如何跨多个 celeryd 进程跟踪撤销的任务

我有一个提醒类型的应用程序,它使用“eta”参数在 celery 中安排任务。如果提醒对象中的参数发生变化(例如提醒时间),那么我会撤销之前发送的任务并将新任务排队。

我想知道是否有任何好的方法可以跟踪 celeryd 重新启动时撤销的任务。我希望能够动态地向上/向下扩展 celeryd 进程,并且似乎在发送 revoke 命令后启动的任何 celeryd 进程仍将执行该任务。

一种方法是保留已撤销任务 ID 的列表,但这种方法会导致列表任意增长。修剪这个列表需要保证任务不再在 RabbitMQ 队列中,这似乎是不可能的。

我还尝试为每个 celeryd 工人使用共享的 --statedb 文件,但似乎 stateb 文件仅在工人终止时更新,因此不适合我想要完成的任务。

提前致谢!

0 投票
3 回答
3238 浏览

celery - 关于将 Celery 与多个负载平衡的 Django 应用程序服务器一起使用的问题

我有兴趣将 Celery 用于我正在开发的应用程序。这一切看起来都很简单,但是如果我有多个负载平衡的应用程序服务器,我对我需要做什么感到有点困惑。所有文档都假定代理将与应用程序位于同一台服务器上。目前,我所有的应用程序服务器都位于 Amazon ELB 后面,并且任务需要能够来自其中任何一个。

这是我认为我需要做的:

  • 在单独的实例上运行代理服务器
  • 配置每个应用程序实例以连接到该代理服务器
  • 每个应用程序实例也将是一个 celery 工作(运行 celeryd)?

我唯一对此感到不满的是:如果我的代理实例死了会发生什么?我可以以某种方式运行 2 个代理实例,这样如果一个发生故障我是安全的吗?

任何关于在像我这样的设置中做什么的提示或信息将不胜感激。我确定我错过了一些东西或不理解一些东西。

0 投票
2 回答
3998 浏览

daemon - 使用 celeryd 作为多个 django 应用程序的守护进程?

我刚开始使用django-celery,我想设置 celeryd 作为守护进程运行。但是,这些说明似乎表明一次只能为一个站点/项目配置它。celeryd 可以处理多个项目,还是只能处理一个?而且,如果是这种情况,是否有一种干净的方法可以将 celeryd 设置为为每个配置自动启动,这需要我为每个配置创建一个单独的初始化脚本?

0 投票
1 回答
1169 浏览

django-celery - Celerybeat 启动后立即关闭

我有一个使用 celeryd 和 celerybeat 的 django 应用程序。两者都设置为作为守护程序运行。celerybeat 任务不会被执行,因为 celerybeat 没有正确启动。根据日志,它立即关闭:

我从 /etc/int.d/celerybeat start 开始

这是 /etc/default/celerybeat 配置:

任务计划在settings.py中设置:

当我使用 ./manage.py celerybeat 从 shell 运行 celerybeat 时,它似乎运行良好。

celeryd 配置中还有一个 celerybeat 部分,但我认为其中一个被忽略了。

问候西蒙

0 投票
1 回答
933 浏览

django - Celeryd Worker 停止处理任务

我有一个 celeryd 和两个工人一起运行,看着他们我看到他们每个接受 4 个任务,处理它们,然后停止处理任务。(请注意,这些任务运行时间很长,最多需要 2 分钟才能处理)。

celeryctl 提供以下信息:

此外,每次发生这种情况时,要打印到日志的最后一件事是:

这些任务也恰好在打印之前失败了,在我的代码中,我调用的是:

如果我杀死 celeryd (^C,它立即死亡,无需等待任务)并重新启动它,它会继续,就像其他一些任务没有发生任何事情并再次死亡(我认为它总是在create_pdf任务中,但日志显示此任务失败并重试没有问题)