我正在使用 Django 和 Celery 在后台运行与联系人/电子邮件解析相关的两个任务。
结构是:
project
/api
/core
tasks.py
settings.py
settings.py 文件包含:
BROKER_URL = 'django://'
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"
#celery
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"
sys.path.append(os.path.dirname(os.path.basename(__file__)))
CELERY_IMPORTS = ['project.core.tasks']
import djcelery
djcelery.setup_loader()
# ....
INSTALLED_APPS = (
#...
'kombu.transport.django',
'djcelery',
)
tasks.py 包含:
from celery.task import Task
from celery.registry import tasks
class ParseEmails(Task):
#...
class ImportGMailContactsFromGoogleAccount(Task):
#...
tasks.register(ParseEmails)
tasks.register(ImportGMailContactsFromGoogleAccount)
此外,在 wsgi.py 中添加
os.environ["CELERY_LOADER"] = "django"
现在,我将这个应用程序托管在 WebFactional 服务器上。在我的本地主机上运行良好,但在 Django 应用程序部署在 Apache 服务器上的 WebFaction 服务器上,我得到:
2013-01-23 17:25:00,067: ERROR/MainProcess] Task project.core.tasks.ImportGMailContactsFromGoogleAccount[df84e03f-9d22-44ed-a305-24c20407f87c] raised exception: Task of kind 'project.core.tasks.ImportGMailContactsFromGoogleAccount' is not registered, please make sure it's imported.
但任务显示为已注册。如果我跑
python2.7 manage.py celeryd -l info
我得到:
-------------- celery@web303.webfaction.com v3.0.13 (Chiastic Slide)
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: django://localhost//
- ** ---------- . app: default:0x1e55350 (djcelery.loaders.DjangoLoader)
- ** ---------- . concurrency: 8 (processes)
- ** ---------- . events: OFF (enable -E to monitor this worker)
- ** ----------
- *** --- * --- [Queues]
-- ******* ---- . celery: exchange:celery(direct) binding:celery
--- ***** -----
[Tasks]
. project.core.tasks.ImportGMailContactsFromGoogleAccount
. project.core.tasks.ParseEmails
我认为这可能是一个相对的导入错误,但我认为 settings.py 和 wsgi.py 的更改会阻止这种情况。
我认为 WebFactional 支持的多个 Python 版本可能与此有关,但是我为 Python 2.7 安装了所有库,并且我还在为 2.7 运行 Django,所以应该没有问题。
使用 celeryd -l info 在 localhost 中运行,当我启动工作程序时,任务也会显示在列表中,但是当我调用任务时它不会输出错误 - 它运行良好。
谢谢