问题标签 [celerybeat]

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 回答
49 浏览

django - 调度启动不起作用

当设置 Celery 并且我想使用调度时,我是在下面添加两个初始化脚本还是只添加celerybeat脚本?

https://github.com/ask/celery/blob/master/contrib/generic-init.d/celeryd

https://raw.github.com/ask/celery/master/contrib/generic-init.d/celerybeat

问题是我有两个脚本并且 Celery 没有在节拍模式下运行并且调度不起作用(正常任务吗?)

0 投票
1 回答
1982 浏览

python - 在 Python 中实现定时器

总体概述

  • 我有中型 django 项目
  • 我在内存中有一堆前缀树(而不是 DB)
  • 这些树的节点表示受超时影响的实体/对象。即,我需要在不同的时间点使这些节点超时

设计:

  • 本质上,我需要一个 Timer 构造,它允许我触发一个可重置的 1-shot 计时器并关联并给它一个回调,该回调可以对创建计时器的实体执行一些操作,在本例中是树的一个节点。

在浏览了各种选项后,我找不到任何可以本地使用的东西(比如一些 django 应用程序)。Python 中的 Timer 对象不适合这种情况,因为它不会扩展/执行。因此,我决定根据以下内容编写自己的计时器:

  1. 包含时间范围的时间增量对象的排序列表
  2. 触发“滴答”的机制

实施选择:

  1. 使用 Bisect 的包装器获取排序的增量列表: http ://code.activestate.com/recipes/577197-sortedcollection/
  2. 与芹菜一起提供滴答声 - 1 分钟的粒度,工作人员将触发我的 Timer 类提供的 timer_tick 函数。timer_tick 本质上应该通过排序列表,每次滴答都会减少头节点。然后,如果任何节点已被标记为 0,则启动回调并将这些节点从排序的计时器列表中删除。
  3. 创建计时器涉及实例化一个返回对象 id 的 Timer 对象。此 id 存储在 db 中,并与 DB 中的条目相关联,该条目表示创建计时器的实体

附加数据结构:为了跟踪 Timer 实例(为每个计时器创建实例化),我有一个 WeakRef Dictionary 将 id 映射到 obj

所以本质上,我在我的主要 Django 项目的内存中有 2 个数据结构。

问题陈述:

由于 celery worker 需要遍历计时器列表并且还可能修改 id2obj 映射,看起来我需要找到一种方法在我的 celery worker 和 main 之间共享状态

通过 SO/Google,我发现以下建议

  1. 经理
  2. 共享内存

不幸的是,bisect wrapper 不适合酸洗和/或状态共享。我通过创建一个字典并尝试将排序列表嵌入到字典中来尝试管理器方法。它出现了一个错误(我猜是因为排序列表持有的内存没有共享并将其嵌入到“共享”内存对象将不起作用)

最后......问题:

  1. 有没有办法可以与工作线程共享我的 SortedCollection 和 Weakref Dict

替代解决方案:

如何保持工作线程简单...让它在每个滴答声中写入 DB,然后使用 post Db 信号在主线程上获得通知并在主线程中执行过期计时器的处理。当然,缺点是我失去了并行化。

0 投票
2 回答
15850 浏览

python - Celerybeat 不执行周期性任务

您如何诊断为什么manage.py celerybeat不执行任何任务?

我正在使用以下命令通过 supervisord 运行 celerybeat:

Supervisord 似乎可以正常运行 celerybeat,日志文件显示:

我有几个定期任务显示为启用http://localhost:8000/admin/djcelery/periodictask,应该每隔几分钟运行一次。但是,celerybeat 日志从不显示正在执行的任何内容。为什么会这样?

0 投票
1 回答
1977 浏览

celery - 用 Chronos 替换 Celerybeat

Chronos有多成熟?它是像 celery-beat 这样的调度程序的可行替代方案吗?

现在,我们的调度实现了一个周期性的“心跳”任务,它检查“未完成”事件并在它们过期时触发它们。我们使用python-dateutil的 rrule 来定义它。

我们正在寻找这种方法的替代方案,Chronos似乎是一个非常有吸引力的替代方案:1)它将减少使用心跳调度任务的必要性,2)它支持以 ISO8601 格式提交事件的 RESTful 提交,3)有一个有用的接口管理,以及 4) 规模化。

关键要求是调度需要可从 Web 界面动态配置。这就是为什么不能使用 celerybeat 的内置调度开箱即用的原因。


我们会通过切换到 Chronos 来打自己的脚吗?

0 投票
1 回答
1686 浏览

python - celeryd 和 celerybeat - “收到未注册的任务类型......”

好吧,伙计们,这让我发疯了。我已经为此工作了一整天,但无法让它工作!
我的芹菜项目结构是这样的:

和:

和:

所有文件都在projects/scheduler/文件夹下。
当我启动celeryd服务时,我可以看到它正在运行并连接到我的代理,但是当我启动celerybeat服务时,我可以在日志中看到消息:Received unregistered task of type 'tasks.test'.
如果我取消注释CELERY_IMPORTS常量(如 SO 中的许多答案中所建议的那样),celeryd服务甚至都不会启动!实际上,它输出OK但使用ps ef | grep celery我可以看到它没有运行。

我的守护进程 conf 文件如下所示:

任何帮助是极大的赞赏。

0 投票
1 回答
10378 浏览

celery - 芹菜节拍不能正常工作

当我为 celery beat 运行这个命令时。

[2013-06-27 02:17:05,936:INFO/MainProcess] Celerybeat:开始...

[2013-06-27 02:17:05,937: INFO/MainProcess] 写条目...

[2013-06-27 02:17:08,711:INFO/MainProcess] DatabaseScheduler:计划已更改。

[2013-06-27 02:17:08,712: INFO/MainProcess] 写条目...

它被困在这个结果上。但在我的 settings.py 中,我配置了 CELERYBEAT_SCHEDULE。

我的芹菜节拍有什么问题?

0 投票
3 回答
10034 浏览

python - 芹菜停止执行链

我有一个定期执行的 check_orders 任务。它创建一组任务,以便我可以计算执行任务所花费的时间,并在它们全部完成后执行某些操作(这是 res.join [1] 和 grouped_subs 的目的)分组的任务是成对的链式任务。

我想要的是当第一个任务不满足条件(失败)时不执行链中的第二个任务。我一生都无法弄清楚这一点,我觉得这对于作业队列管理器来说是非常基本的功能。当我尝试我在 [2] 之后注释掉的东西时(引发异常,删除回调)......我们由于某种原因卡在 check_orders 中的 join() 上(它破坏了组)。对于所有这些任务,我也尝试将 ignore_result 设置为 False,但它仍然不起作用。

0 投票
3 回答
3800 浏览

django - Django Celery Scheduling a manage.py command

I need to update the solr index on a schedule with the command:

I've looked through the Celery docs and found info on scheduling, but haven't been able to find a way to run a django management command on a schedule and inside a virtualenv. Would this be better run on a normal cron? And if so how would I run it inside the virtualenv? Anyone have experience with this?

Thanks for the help!

0 投票
0 回答
347 浏览

python - zoneinfo 数据损坏,如何编译新数据?

当我问这个问题时,基本上同样的事情又发生了。然而,这一次我不能再做对了。我再次尝试了 Burhan Khalid 的答案,但又遇到了同样的错误。我还尝试再次从备份中复制粘贴 zoneinfo 文件夹,但这次它没有修复我的错误。

Django 版本 = 1.4.5

芹菜版本 = 3.0.8

Django-Celery 版本 = 3.0.6

pytz 的版本 = 2013b(与我正在下载的文件相同)

操作系统 = Mac 山狮


尝试1:

  1. 清除 zoneinfo 文件夹 (/usr/share/zoneinfo/)
  2. 将 tar gz 文件粘贴到文件夹 (tzdata2013b.tar.gz)
  3. 使用 Burhan Khalid 提供的命令提取 tar gz 文件
  4. 创建 Burhan Khalid 提供的脚本
  5. 运行脚本

结果:

当我检查 zoneinfo 文件夹中确实没有名为 Europ 的文件夹时,之前有一个文件夹


尝试2:

  1. 不要清除 zoneinfo 文件夹(我从上面尝试之前所做的备份中将其放回)
  2. 将 tar gz 文件粘贴到文件夹 (tzdata2013b.tar.gz)
  3. 使用 Burhan Khalid 提供的命令提取 tar gz 文件
  4. 在 zoneinfo 文件夹中创建 Burhan Khalid 提供的脚本
  5. 运行脚本

结果 2:

在第 3 步,我得到以下输出,包括一些错误:

在第 5 步,我得到以下输出,包括一些错误:

而且我仍然有损坏的文件。


尝试 3:

  1. 再次恢复备份 zoneinfo 文件夹
  2. 在桌面上创建单独的文件夹
  3. 将 tar gz 文件和脚本粘贴到桌面上的新文件夹中
  4. 使用命令解压 tar gz 文件
  5. 执行脚本

结果 3:

第 3 步和第 5 步没有给出错误或异常输出

尝试运行 celery beat 仍然会导致文件损坏错误


问题 我在这里做错了什么。我似乎无法弄清楚这一点......


编辑

所以我做了一些更多的挖掘,发现了以下内容:

  1. 如果我通过工头运行而不是通过 Procfile 运行相同的命令,即使它是 Procfile 中的唯一命令,我也不会收到错误
  2. 错误的文件描述符错误意味着 Python尝试关闭已经关闭的文件而不是文件损坏

这使我得出结论,在使用 Procfile 时,工头中的某些东西会强制文件在正确关闭之前关闭……想法?

0 投票
4 回答
8349 浏览

python - 用 supervisor 和 virtualenv 监督 celerybeat

我的 celerybeat.conf

当我启动主管时,我收到一个错误:

知道如何解决这个问题吗?