WorkerLostError, Python.exe APPCRASH с django / сельдереем под Windows - PullRequest
1 голос
/ 12 ноября 2011

У меня Django настроен под Windows (Win2008 Server R2, IIS 7.5, MS SQL). Я пытаюсь реализовать сельдерей 2.4.1 (с RabbitMQ) для обработки задач и столкнулся с очень неприятной проблемой.

Я начинаю celeryd с рекомендуемого:

manage.py celeryd --settings=settings

и все работает нормально. Затем в моем проекте django я запускаю задачу для запуска (для тестирования я просто использую простой пример «add»:

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

и это называется в моем views.py как:

tasks.add.delay(1,2)

Когда Celeryd поднимает это, происходит пара вещей, иногда : 1) Я получаю диалоговое окно Windows, «python.exe перестал работать», и возможность закрыть его. 2) После закрытия этого в cmd, где работает celeryd, я получаю:

[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:

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 голосов
/ 13 июня 2012

Наконец, после многих месяцев работы с этим, я думаю, что я понял это.

Проблема, по-видимому, связана с использованием django-mssql в качестве движка базы данных Django. django-mssql полагается на pywin32, и один из вызовов там использует ole32.dll и вызывает сбой там, что приводит к отключению Python, следовательно, WorkerLostError.

Я переключился на django-pyodbc, который не использует проблемный вызов pywin32 / ole32.dll, и не сталкивался с необъяснимой ошибкой WorkerLostError, такой как эти, с момента переключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...