2011-11-12 11 views
1

Windows(Win2008 Server R2、IIS 7.5、MS SQL)でDjangoをセットアップしました。私はタスク処理と非常にイライラの問題に実行するためにセロリ2.4.1(RabbitMQと)を実装しようとしている。WorkerLostError、Python.exe Windows下でdjango/celeryを使用したAPPCRASH

私が推奨してcelerydを起動します。

manage.py celeryd --settings=settings 

、それはOKに実行されます。

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

とそのは次のように私のviews.pyに呼ばれています:

tasks.add.delay(1,2) 
その後、私のDjangoプロジェクトでは、私は(テストのために私は簡単な例を「追加」を使用しています開始するタスクをトリガ

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. 

私はちょうど約すべてのセロリの設定を1つずついじり非常にうんざりするほど試してみた、それはおそらく(労働者に影響を与える可能性があります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の実装におそらく固有の)セロリのバグを疑うが、私はかなりそれを識別または提案するまだチョップを持っていません修正。

+0

これについての調査結果はありますか?私はボルカーと同じ問題を抱えています。 – MarcosPri

+1

WorkerLostErrorsをまだ取得していますが、回避策を見つけました。私は周りを見ていて、多数のタスク(>> numberOfWorkers *同時実行)をキューに入れた場合、最初の 'n'個のタスクは失敗します後続のタスクは成功します。だから、基本的に労働者はある種の「キック」が必要なのです。私の具体的なケースでは、2の並行性を持つ2人の作業者がいます。少なくとも8つのタスクを送信すると、やりとりを乗り越えることができます。私は、特にこの目的のために何もしない単純な "DummyTask"を設定しました。 – djangodude

答えて

0

最後に、これで何ヶ月も切れ目を入れて、私はそれを理解したと信じています。

問題は、Djangoデータベースエンジンとしてdjango-mssqlを使用しているように見えます。 django-mssqlはpywin32に依存しています。そこにある呼び出しの1つがole32.dllを使用してクラッシュするため、結果的にPythonがダウンし、WorkerLostErrorが発生します。

私は問題のpywin32/ole32.dll呼び出しを使用しないdjango-pyodbcに切り替えました。切り替え後に説明できないWorkerLostErrorを経験していません。