无法启动 Celery Worker (Kombu.asynchronous.timer)

Cannot start Celery Worker (Kombu.asynchronous.timer)

我按照第一步使用 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:\anaconda3\lib\site-packages\celery\concurrency\prefork.py", line 
18, in <module>
from celery.concurrency.base import BasePool
File "c:\anaconda3\lib\site-packages\celery\concurrency\base.py", line 15, 
in <module>
from celery.utils import timer2
File "c:\anaconda3\lib\site-packages\celery\utils\timer2.py", line 16, in 
<module>
from kombu.asynchronous.timer import Entry
ModuleNotFoundError: No module named 'kombu.asynchronous.timer'

我搜索了很多,但似乎无法正常工作。任何帮助将不胜感激。谢谢!

我在与您相同的 python 版本上测试了芹菜,没问题。并且 https://github.com/celery/kombu/blob/master/kombu/asynchronous/timer.py 表明随机重命名对您没有帮助。也许您应该尝试 pip uninstall kombu && pip --no-cache-dir install -U kombukombu 执行全新安装。我想你的安装一定有问题。因此,如果 kombu 重新安装无效,请尝试重新安装整个程序。

TL;DR: 从 virtualenv 的根目录中删除 kombu 目录(如果它存在)。它可能只会在 Windows.

上失败

这似乎是一个怪癖。我发现了同样的错误,并检查了发生了什么。

pip下载的wheel包看起来不错(kombu.asynchronous.timer里面有)。最后一个版本(当前为 4.2.0)的发布也很好。奇怪的是我在我的 virtualenv 安装中发现了什么。

我在我的 virtualenv 根目录中找到了一个 kombu 目录,其中包含库的内容,但它还有一个 "async" 目录,旁边还有一个 "asynchronous" 目录。这些目录不是来自 4.2.0 版本,因为异步有 timer.py 文件但异步没有。

它从哪里来的?似乎来自 wheel 的数据目录。

所以,解决方案:我从 virtualenv 的根目录中删除了 kombu 目录,celery 起作用了。

我有同样的问题,但是当用 3.1.25 版本重新安装 celery 时解决了

pip uninstall celery && pip install celery==3.1.25

可能是因为windows官方不支持celery 4, https://github.com/celery/celery/issues/3551

我刚开始使用 Celery。 我按照说明安装了 Celery v 4.2.0

当我尝试 运行 命令时: celery -A mysite worker -l info 我收到错误:

ModuleNotFoundError: No module named 'kombu.asynchronous.timer

我删除了 Celery 安装:pip uninstall celery

之后安装了 Celery 3.1.25 作为 'chuhy' 推荐

但是..它还有一些其他问题,所以我立即卸载了 3.1.25 ,并重新安装了 celery v4.2.0 。

在这种情况下,错误不再弹出。

我在 Windows 上工作,所以我遇到了一些问题。 但我的解决方案是使用 python 3.6.8 创建新的 conda env(据我所知,芹菜可能适用于 python 3.7,但有很多问题)。 然后继续安装最新版本的 celery(4.3.0) 和 Django(2.2.3),之后一切正常。

我在使用 pip (3.1.26Post2) 的默认 Celery 安装时遇到了这个问题。如上所述,我安装了 3.1.25 版,但 Celery 仍然无法正常工作。因此我明确安装了最新版本:

pip install Celery==4.3

现在一切正常!

我在阅读 celery 4.4 documentation 时尝试安装 django-celery 后登陆这里,这个包强制 celery 版本为 3.1.26.post2,所以我不得不:

pip uninstall django-celery
pip uninstall celery && pip install celery # Uninstall 3.1 and install latest

正如文档中明确指出的那样:

Django is supported out of the box now so this document only contains a basic way to integrate Celery and Django. You’ll use the same API as non-Django users so you’re recommended to read the First Steps with Celery tutorial first and come back to this tutorial.

我遇到过类似的问题,这是因为旧版本的芹菜。卸载 celery(pip uninstall celery)并再次安装(pip install Celery==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))

当我去找 运行 工作人员(确保你和 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

这促使我使用最新版本的 celery,4.3...根据这个 SO 问题 (),windows 不支持 celery 4+,它很方便地提供了这个答案(发布者:Samuel Chen):

对于芹菜 4.2+,python3,windows 10

pip install gevent
celery -A <project> worker -l info -P gevent

对于芹菜 4.1+,python3,windows 10

pip install eventlet
celery -A <project> worker -l info -P eventlet

我得到的唯一其他错误是 django 的调试器处于打开状态,这显然会导致内存泄漏...

问题(至少对我而言)是我无法使用 Prefork 池,这意味着我无法使用 app.control.revoke() 来终止任务。

---编辑---

另外值得一提的是,在发布这个答案后,我切换到了一个 linux 框。我不知道,由于缺乏经验,有不同的模式你可以 运行 后台任务。我不记得所有的名字,但如果你输入 google “celery multithreading vs gevent ",它可能会返回一些您可以 运行 celery 使用的其他模式,它们的目的以及每个平台支持哪些模式。 Windows 不能 运行 我认为对我的问题最有意义的模式(我相信它是多线程),这是一个真正的问题。然而 linux 可以 运行 所有这些......所以我切换回 linux,只是为了芹菜。我在 redhat 环境中遇到了 DJango 的一些问题,所以我也必须解决这些问题:|