我在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实施?)但我还没有确定它或提出修复方法。
答案 0 :(得分:0)
最后,经过几个月的修补,我相信我已经弄明白了。
问题似乎来自使用django-mssql作为Django数据库引擎。 django-mssql依赖于pywin32,其中一个调用使用ole32.dll并导致崩溃,从而导致Python崩溃,因此导致了WorkerLostError。
我已经切换到不使用有问题的pywin32 / ole32.dll调用的django-pyodbc,并且自切换以来没有遇到过这样的无法解释的WorkerLostError。