在Windows下使用django / celery的WorkerLostError,Python.exe APPCRASH

时间:2011-11-12 04:33:50

标签: windows django celery

我在Windows下设置了Django(Win2008 Server R2,IIS 7.5,MS SQL)。我正在尝试使用芹菜2.4.1(使用RabbitMQ)进行任务处理并遇到一个非常令人沮丧的问题。

我以推荐的方式开始芹菜:

manage.py celeryd --settings=settings

它运行正常。然后在我的django项目中,我触发一个任务开始(测试我只是使用简单的“添加”示例:

@task
def add(x, y):
    return x + y

并在我的views.py中调用:

tasks.add.delay(1,2)

当celeryd选择这个时,会发生一些事情,有时候: 1)我得到一个Windows对话框,“python.exe已停止工作”,并有一个关闭它的选项。 2)关闭之后,在celeryd运行的cmd中,我得到:

[date-time: ERROR/MainProcess] Task [taskUUID] raised exception: WorkerLostError('Worker exited prematurely.',)
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\celery\concurrency\processes\pool.py", line 610, in _join_exited_workers
    raise WorkerLostError("Worker exited prematurely.")
WorkerLostError: Worker exited prematurely.

我已经尝试过非常繁琐地修补每一个芹菜设置,一次一个,可能会影响工人(CELERYD_CONCURRENCY,CELERYD_PREFETCH_MULTIPLIER,CELERYD_MAX_TASKS_PER_CHILD等),对此没有任何影响。

有什么奇怪的是,有时候,在那之后发生了(我只是让celeryd运行......它不会杀死那个进程......?),我可以再次触发任务,没有python.exe崩溃,任务将顺利完成。

来自settings.py的我与celery相关的设置:

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

CELERY_IMPORTS = ("myproject.tasks",)
CELERY_RESULT_BACKEND = "database"

CELERY_SEND_EVENTS=True #same as '-E' option from cmd

我强烈怀疑一个芹菜虫(可能特定于Windows实施?)但我还没有确定它或提出修复方法。

1 个答案:

答案 0 :(得分:0)

最后,经过几个月的修补,我相信我已经弄明白了。

问题似乎来自使用django-mssql作为Django数据库引擎。 django-mssql依赖于pywin32,其中一个调用使用ole32.dll并导致崩溃,从而导致Python崩溃,因此导致了WorkerLostError。

我已经切换到不使用有问题的pywin32 / ole32.dll调用的django-pyodbc,并且自切换以来没有遇到过这样的无法解释的WorkerLostError。