问题标签 [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.
amazon-ec2 - 芹菜工人只使用 15% 的 cpu?
我正在运行一个 celery + rabbitmq 应用程序。我启动了一堆 ec2 机器,但我发现我的 celery worker 机器只使用了大约 15% 的 cpu(30% 的峰值)。我已经为每台机器配置了 6 个 celery 工人(我只是将工人的数量设置为比虚拟 cpu # 高得多)。
芹菜工人不应该接近使用 100% cpu 利用率吗?我觉得我的员工好像在“偷懒”,想知道这是否经常发生。我应该只保留每个核心的默认 1 celery worker 吗?
查看我的芹菜工人日志时,他们都在工作并成功连接到我的单一经纪人。我已经关闭了诸如 celery heartbeats 之类的选项,因为它们给我带来了同步/延迟问题。
更多信息:即使我使用多个工作人员,我也没有使用 celery --concurrency 选项或 eventlet。
python - 带有 RabbitMQ 的 celeryd 挂在“混合:搜索邻居”上,但普通 celery 有效
我正在用 celeryd 和 RabbitMQ 撞墙。
教程中的这个例子工作得很好:
我跑:
我得到输出:
我现在可以从 python repl 运行任务并获得结果。
但是当我安装 celeryd 时,该过程在混合步骤中挂起:
出现此之后没有输出。
我的 /etc/default/celeryd 看起来像这样:
我正在使用这些版本:
Ubuntu 14.04 芹菜 3.1.16 (Cipater) 芹菜 3.1.6-1ubuntu1 rabbitmq-server 3.2.4-1 Python 2.7.6
因此,如果没有守护进程,芹菜可以自行初始化,但使用守护进程(celeryd)显然会挂在混合步骤上。
一些论坛建议这是 RabbitMQ 达到磁盘空间限制的问题。我有很多磁盘,而且 RabbitMQ 自己的日志没有显示任何问题。
python - Celery:如何用不同的工人区分不同的环境?
我需要将某个 django 站点实例的所有任务路由到某个队列。我的设置如下:
- 多个运行 Django 项目的网络服务器 (1.7)
- 一台运行芹菜工人的服务器(3.1.7)
- 三种环境:生产、登台、开发。每个环境都以
DJANGO_SETTINGS_MODULE
不同的CELERY_DEFAULT_QUEUE
设置运行。 - 一个 redis 实例作为代理(同一数据库中的所有内容)
在“芹菜服务器”上,我通过主管(简化配置)运行多个工作实例:
这有效,检查:
(名称符合 CELERY_DEFAULT_QUEUE 设置)
website/celery.py
包含基础知识(跳过导入):
因此,我希望使用开发设置运行的网络服务器生成的任务仅在development_queue
. 但是,我看到任务正在由不同的队列或所有三个队列处理,这是有问题的。
我的期望是否错误,因为这将是分离这些任务的好方法?所有关于路由的文档都是关于将不同的任务路由到不同的队列,我不需要。我需要将某个站点(环境)的所有任务路由到某个队列。我可以做些什么来分离这些环境?
celery - 为 celery 工作流返回神秘的无关 task_id。
我有一个相当复杂的工作流程(动态构建),看起来像这样:
)
然后芹菜变成这样:
请注意和弦末尾的任务是如何被推入“任务”标题的。根据我的阅读,这些任务存储在主任务标题中,并且在和弦标题完成执行之前不会放入队列中。
当我尝试显示整个工作流的 task_id 时(我希望它是工作流中的 task_id 之一)。
我得到的这个任务 ID 没有存储在 celery_taskmeta 或 celery_tasksetmeta 中。这不是在工作流中执行的任何任务(请参阅下面的工作日志)。任何想法,这个 task_id 代表什么,如果有的话我可以将它链接到任何正在执行的任务?
我希望能够遍历结果并显示工作流中每个任务的状态。但是,我得到的这个任务 ID 似乎与任何任务无关。下面是工作日志,您会看到上面打印的任务 ID 找不到!有任何想法吗?谢谢。
python - 使用导入的装饰器包装 app.task 函数时出现 Celery KeyError;仅带导入的错误
给定布局:
并启动_server.py
并celery -A background._server worker
我得到了一个KeyError: u'generic.adder'
尝试使用 a 调用generic.adder
函数.delay(..)
加法器函数:
文件generic.py
..用一个函数包装,该函数接受app
实例并将 Celery Task 的输入/输出标准化为返回结果和函数的 JSON 对象。(包括在下面)但是,问题是当这个包装函数与 generic.adder 在同一个文件中时,它可以完美地工作——当它像上面那样被导入和使用时,它会抛出关键错误。
我被引导相信包装器以某种方式修改了name=..
传递给app.task
函数名称的属性,从该函数名称helpers.py
导致文字名称generic.adder
的属性,导致从任务访问时找不到
同样重要的是要注意,如果您尝试adder(..)
从内部打电话_server.py
调用(从 celery CLI 运行的模块)它可以完美运行;只有在通过分布式接口调用时才会抛出错误;意思是,进口工作独立于芹菜。
文件helpers.py
文件_server.py
django - 使用 Supervisor 启动 Celery 时如何避免 SECRET_KEY 错误?
我有一个 Django 1.62 应用程序在 Debian 7.8 上运行,Nginx 1.2.1 作为我的代理服务器,Gunicorn 19.1.1 作为我的应用程序服务器。我已经安装了 Celery 3.1.7 和 RabbitMQ 2.8.4 来处理异步任务。我正在尝试使用 Supervisor 3.0a8 管理我的各种应用程序,尤其是 Celery。问题是当我尝试通过 Supervisor 启动 Celery 时,出现以下错误:
(我在底部显示了整个堆栈跟踪。)
我所有的配置文件都保存在一个“conf”目录中,该目录位于我的“myproj”项目目录下方,如下所示:
我的生产 Django 设置保存在 prod.py 设置文件中,该文件继承了我的 base.py 基本设置。我将密钥保存在我的虚拟环境的 postactivate 文件中,并将其读入我的生产设置中,如下所示。我已经通过 Python 解释器验证了密钥存在于我的生产设置中。
这是读取密钥的 get_env_variable 函数:
这是我的主管配置文件。它基于Celery 文档中显示的示例文件:
下面是我如何使用 Supervisor 加载新的 Celery 配置:
这是我的 Celery 应用程序文件:
这是我的芹菜配置文件:
根据 Celery 文档,我修改了 __init__.py:
我可以使用以下命令手动启动 Celery,它启动得很好:
但是,当我尝试通过 Supervisor 启动它时,我得到了我所描述的错误。考虑到主管可能无法访问 Django 密钥,因为它是一个环境变量,我尝试在我的 prod.py 设置文件中对密钥进行硬编码(而不是通过 get_env_variable 函数读取它),但这并没有解决问题。
我尝试将我的所有设置组合到包含实际密钥的 prod.py 设置文件中,但这没有帮助。
我还尝试将此环境参数添加到主管配置文件中,如下所示,但这并没有解决问题:
我尝试将“用户”设置为我启动网站的用户名,但这也无济于事。
我读到了一个名为django-supervisor的库,它应该可以简化 Django 和 Supervisor 之间的集成,但如果我使用该库,我会遇到同样的错误。
最后我在这里读到,如果你的密钥包含一个“%”符号,主管不会喜欢它。我注意到我的密钥确实包含一个“%”符号,所以我像这个“%%”一样对其进行了转义,但这也没有解决问题。
谁能看到我做错了什么?我在这里看到了用户在不同情况下遇到相同错误的其他问题,但我尝试实施讨论过的各种解决方案,但没有一个解决了问题。
非常感谢您的想法。很抱歉这个问题很长,但这个问题有很多活动部分。
这是整个堆栈跟踪:
python - Django/Python:celery taks.py 中的导入错误
我在 celery task.py 中遇到导入错误。另一个包中的 StockManager 类方法用于保存详细信息。但是,我收到 StockManager() 的导入错误。我该如何解决这个问题。我做错什么了吗?
谢谢
django - 芹菜没有在生产中运行
我正在尝试在生产中运行 celery 和 celerybeat。在我当前的 django 应用程序中,我可以使用命令“celery -A Gorgon worker”和“celery -A Gorgon beat -l debug --max-interval=10”进行测试和运行。另外,我正在通过 virtualenv 运行它。另外,我使用 redis 作为任务代理。
整个应用程序在 gunicorn 服务器上运行。但是,当我尝试守护进程时,它会因 111 连接错误而失败。
我已将https://github.com/celery/celery/tree/3.0/extra/generic-init.d中所需的脚本添加到目录 /etc/init.d
至于 /etc/defaults 中的脚本,它们看起来像这样:
我的芹菜脚本如下
我的 celerybeat 脚本是
如何使用 /home/ubuntu/sites/virtualenv 中的当前虚拟环境让我的 celery 设置作为守护进程运行
django - 在 celery 中提交链时从 AsyncResult 获取 task_name
当我得到它的对象并因此得到它时,我应该如何检索任务的名称?AsyncResult
id
例如,如果我在一个链中启动两个任务:
我可以使用如下内部方法检索id
task_B和task_A :_parents()
但是,当我尝试检索 task_name 时,我什么也得不到:
为什么会这样?这可能是一个错误吗?我注意到通过提交单个任务,该task_name
属性AsyncResult
可以正常工作并返回正确的任务名称。
有没有其他方法可以从 AsyncResult 对象中检索任务的名称?
谢谢大家。
PS我已经在这里找到了一个类似的问题,但似乎没有人提出一个实用且可行的解决方案。
更新
显然,我似乎与这个撞墙了。github上有一张关于完全相同的问题的公开票,不同之处在于它涉及组而不是链。
django - /etc/init.d/celeryd 在 AWS 上启动失败
嗨,我在这个论坛上读了很多关于这个的内容,但我只是不知道现在出了什么问题,看起来一切都很好,但就是不工作
我像这样设置我的本地配置(/etc/default/celeryd):
当我运行 /etc/init.d/celeryd start 我得到这个:
但是工作人员没有运行(/etc/init.d/celeryd 状态):
我读了一些关于像这样运行的东西(sh -x /etc/init.d/celeryd start)并发现错误,大多数时候是文件权限错误,但我看不出有什么问题
有任何想法吗?