我用Celery(Django)迈出了第一步,并试图在后台运行一个繁重的进程。我安装了 RabbitMQ 服务器。但是,当我尝试时,celery -A my_app worker -l info
抛出以下错误
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "c:anaconda3libsite-packagesceleryconcurrencyprefork.py", line
18, in <module>
from celery.concurrency.base import BasePool
File "c:anaconda3libsite-packagesceleryconcurrencybase.py", line 15,
in <module>
from celery.utils import timer2
File "c:anaconda3libsite-packagesceleryutilstimer2.py", line 16, in
<module>
from kombu.asynchronous.timer import Entry
ModuleNotFoundError: No module named 'kombu.asynchronous.timer'
我已经搜索了很多,但似乎无法让它工作。任何帮助将不胜感激。谢谢!
我在从 pip (3.1.26Post2) 安装默认的 Celery 时遇到了这个问题。如上所述,我安装了 3.1.25 版,但 Celery 仍然无法正常工作。因此,我显式安装了最新版本:
点安装芹菜==4.3
现在一切正常!
我在阅读 celery 4.4 文档时尝试安装django-celery
后降落在这里,这个包强制 Celery 版本3.1.26.post2
,所以我不得不:
pip uninstall django-celery
pip uninstall celery && pip install celery # Uninstall 3.1 and install latest
正如文档明确指出的那样:
Django 现在开箱即用,因此本文档只包含集成 Celery 和 Django 的基本方法。您将使用与非 Django 用户相同的 API,因此建议您先阅读 Celery 的第一步教程,然后再回到本教程。
TL;DR:从虚拟环境的根目录中删除 kombu 目录(如果存在)。它可能只会在Windows上失败。
这似乎是一个怪癖。我发现了同样的错误,并检查了发生了什么。
pip 下载的轮子包看起来不错(其中存在 kombu.async.timer)。最新版本(当前为 4.2.0)的版本也很好。奇怪的是我在虚拟环境安装中发现了什么。
我在我的 virtualenv 根目录中找到了一个 kombu 目录,其中包含库的内容,但它也有一个"异步"目录和一个"异步"目录。这些目录不是来自 4.2.0 版本,因为异步具有 timer.py 文件,但异步没有。
它从哪里来?从轮子的数据目录中可以看出。
所以,解决方案:我从我的虚拟环境根目录中删除了 kombu 目录,芹菜工作了。
我有同样的问题,但在使用 3.1.25 版重新安装芹菜时解决了它
pip uninstall celery && pip install celery==3.1.25
也许是因为 Windows 不受芹菜 4 的正式支持,https://github.com/celery/celery/issues/3551
我在您拥有的相同 python 版本上测试了芹菜,没关系。 而且 https://github.com/celery/kombu/blob/master/kombu/asynchronous/timer.py 表明随机重命名东西对您没有帮助。也许您应该尝试pip uninstall kombu && pip --no-cache-dir install -U kombu
为kombu
执行全新安装。我想你的安装一定有问题。因此,如果kombu
重新安装不起作用,请尝试再次安装整个内容。
我刚从芹菜开始。 我按照说明安装了芹菜 v 4.2.0
当我尝试运行命令时:celery -A mysite worker -l info
我收到错误:
ModuleNotFoundError: No module named 'kombu.asynchronous.timer
我删除了芹菜安装:pip uninstall celery
之后安装了芹菜 3.1.25 作为"chuhy"推荐
但。。它还有其他一些问题,所以我立即卸载了 3.1.25 ,并重新安装了芹菜 v4.2.0 .
在这种情况下,错误不会再次弹出。
我遇到了类似的问题,这是因为旧版本的芹菜。卸载芹菜(pip卸载芹菜)并再次安装(pip安装芹菜= = 4.3)并kaboom它将起作用。
所以我正在运行 Windows 10,python3.9.x,使用 aws sqs 作为代理,刚刚完成一些文件的更新:
settings.py
###
### For celery tasks!
###
from kombu.utils.url import safequote
import urllib.parse
AWS_ACCESS_KEY_ID = 'my aws_access_key_id for a user'
AWS_SECRET_ACCESS_KEY = 'my aws_secret_access_key for a user'
BROKER_URL = 'sqs://%s:%s@' % (urllib.parse.quote(AWS_ACCESS_KEY_ID, safe=''), urllib.parse.quote(AWS_SECRET_ACCESS_KEY, safe=''))
BROKER_TRANSPORT = 'sqs'
BROKER_TRANSPORT_OPTIONS = {
'canves-celery-queue': {
'access_key_id': safequote(AWS_ACCESS_KEY_ID),
'secret_access_key': safequote(AWS_SECRET_ACCESS_KEY),
'region': 'us-east-1'
}
}
CELERY_DEFAULT_QUEUE = 'celery<-project-queue>'
CELERY_QUEUES = {
CELERY_DEFAULT_QUEUE: {
'exchange': CELERY_DEFAULT_QUEUE,
'binding_key': CELERY_DEFAULT_QUEUE,
}
}
###
### End celery tasks
###
celery_tasks.py(在教程中称为 celery.py - 重命名,因为显然这导致了其他一些程序员的一些错误):
from __future__ import absolute_import
import os
from celery import Celery
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project>.settings')
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app = Celery('<project>', include=['<project>.tasks'])
app.config_from_object('django.conf:settings')
# Load task modules from all registered Django apps.
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print("debug_task was fired!")
print(f'Request: {self.request!r}')
if __name__ == '__main__':
app.start()
tasks.py(这与 settings.py 位于同一目录中 - 也在celery_tasks.py中引用)
from __future__ import absolute_import
from .celery_tasks import app
import time
@app.task(ignore_result=True)
def sleep(x, y):
print("Sleeping for: " + str(x + y))
time.sleep(x + y)
print("Slept for: " + str(x + y))
当我去运行 worker 时(确保您与 manage.py 位于同一目录中),它抛出了此错误:
from kombu.async.timer import Entry, Timer as Schedule, to_timestamp, logger
为了修复它,我按照 gogaz 的答案运行
pip uninstall django-celery
pip uninstall celery && pip install celery
这把我推到了最新版本的芹菜,4.3... 根据这个SO问题,Windows不支持芹菜4+(Celery提出ValueError:没有足够的值来解压缩),它方便地有这个答案(由Samuel Chen发布):
适用于 Celery 4.2+、Python 3、Windows 10
pip install gevent
celery -A <project> worker -l info -P gevent
适用于芹菜 4.1+、Python 3、Windows 10
pip install eventlet
celery -A <project> worker -l info -P eventlet
我得到的唯一另一个错误是 django 的调试器打开,这显然会导致内存泄漏......
问题(至少对我来说)是我不能使用 Prefork 池,这意味着我不能使用 app.control.revoke() 来终止任务。
---编辑---
另外值得一提的是,这个答案发布后,我切换到了 linux 盒子。我不知道,由于缺乏经验,您可以使用不同的模式运行后台任务。我不记得所有的名字,但如果你在谷歌中输入"芹菜多线程与gevent",它可能会返回一些你可以运行芹菜的其他模式,它们的用途以及每个平台支持哪些模式。Windows无法运行我认为对我的问题最有意义的模式(我相信这是多线程),这是一个真正的问题。但是Linux可以运行所有这些...所以我改回Linux,只是为了芹菜。我在 redhat 环境中使用 DJango 时遇到了一些问题,所以我也必须解决这些问题:|
我在Windows上工作,所以我对此有一点问题。 但我的解决方案是使用 python 3.6.8 创建新的 conda env(据我所知,芹菜可能适用于 python 3.7,但存在很多问题)。然后继续安装最新版本的芹菜(4.3.0)和Django(2.2.3),之后一切正常。