0

我将 celery 与 django 一起使用,但不是 django-celery 模块。

我得到非常奇怪的数据库错误。它们每次都会发生,但因人而异。这里有些例子:

  • ProgrammingError('没有要获取的结果',)
  • TransactionManagementError:事务管理块以挂起的 COMMIT/ROLLBACK 结束
  • IntegrityError:在表“myapp_mymodel”上插入或更新违反了外键约束“myapp_mymodel2_mymodel_id_fkey”:详细信息:表“myapp_mymodel”中不存在键(mymodel_id)=(10082)。
  • MaybeEncodingError:发送结果时出错:'""'。原因:''PicklingError("Can\'t pickle : attribute lookup myapp.models.DoesNotExist failed",)''。

如果我直接调用它(没有芹菜),代码运行良好。

4

1 回答 1

0

Celery 使用 fork() 启动工作进程。如果您在导入期间使用 django 数据库连接的 celeryconfig.py(或您的 tasks.py 模块)中执行某些操作,则必须重新加载数据库连接。

但更好的解决方案是:在导入期间不要使用数据库连接(在模块或类级别)。

您可以使用这个小脚本来查看导入堆栈深处是否确实使用了数据库:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.db.backends import BaseDatabaseWrapper
def raise_exception(self):
    raise Exception('Do not execute SQL during importing Python code!')

BaseDatabaseWrapper.cursor=raise_exception

import celeryconfig
for module in celeryconfig.CELERY_IMPORTS:
    __import__(module)
于 2013-06-04T12:24:49.083 回答