Celery: Windowsでタスクを実行できません

作成日 2017年06月08日  ·  13コメント  ·  ソース: celery/celery

Celery 4.xが起動します(修正#4078を使用)が、すべてのタスクがクラッシュします

再現する手順

ファーストステップチュートリアルを使用する(http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html)

セロリ-タスクワーカー--loglevel = info
add.delay(2,2)

予想される行動

タスクが実行され、4の結果が生成されます

実際の動作

セロリがクラッシュします。

"C:\ Program Files \ Python36 \ Scripts \ celery.exe" -perse.celeryワーカー-linfo

-------------- celery @ PETRUS v4.0.2(latentcall)


--- * * * -Windows-10-10.0.14393-SP0 2017-06-08 15:31:22


  • ** ---------- [config]
  • ** ----------。>アプリ: perse:0x24eecc088d0
  • * ----------。>トランスポート: amqp:// guest * @ localhost:5672 //
  • ** ----------。>結果:rpc://
  • * --- * ---。>同時実行性:12(プリフォーク)- * ** ----。>タスクイベント:オフ(-Eを有効にしてこのワーカーのタスクを監視します)

-------------- [キュー]
。>セロリ交換=セロリ(直接)キー=セロリ

[タスク]
。 perse.tasks.celery_add

[2017-06-08 15:31:22,685:INFO / MainProcess] amqp:// guestに接続し* @ 127.0.0.1:5672 //[2017-06-08 15:31:22,703:INFO / MainProcess]混ざり合う:隣人を探しています[2017-06-08 15:31:23,202:INFO / SpawnPoolWorker-5] self.run()を呼び出す子プロセス5124[2017-06-08 15:31:23,207:INFO / SpawnPoolWorker-4] self.run()を呼び出す子プロセス10848[2017-06-08 15:31:23,208:INFO / SpawnPoolWorker-10] self.run()を呼び出す子プロセス5296[2017-06-08 15:31:23,214:INFO / SpawnPoolWorker-1] self.run()を呼び出す子プロセス5752[2017-06-08 15:31:23,218:INFO / SpawnPoolWorker-3] self.run()を呼び出す子プロセス11868[2017-06-08 15:31:23,226:INFO / SpawnPoolWorker-11] self.run()を呼び出す子プロセス9544[2017-06-08 15:31:23,227:INFO / SpawnPoolWorker-6] self.run()を呼び出す子プロセス16332[2017-06-08 15:31:23,229:INFO / SpawnPoolWorker-8] self.run()を呼び出す子プロセス3384[2017-06-08 15:31:23,234:INFO / SpawnPoolWorker-12] self.run()を呼び出す子プロセス8020[2017-06-08 15:31:23,241:INFO / SpawnPoolWorker-9] self.run()を呼び出す子プロセス15612[2017-06-08 15:31:23,243:INFO / SpawnPoolWorker-7] self.run()を呼び出す子プロセス9896[2017-06-08 15:31:23,245:INFO / SpawnPoolWorker-2] self.run()を呼び出す子プロセス260[2017-06-08 15:31:23,730:INFO / MainProcess]混ざり合う:すべて一人で[2017-06-08 15:31:23,747:INFO / MainProcess] celery @PETRUSの準備ができました。[2017-06-08 15:31:49,412:INFO / MainProcess]受信したタスク:perse.tasks.celery_add [524d788e-e024-493d-9ed9-4b009315fea3][2017-06-08 15:31:49,416:ERROR / MainProcess]タスクハンドラーでエラーが発生しました:ValueError( '解凍するのに十分な値がありません(予期された3、0を取得しました)'、)トレースバック(最後の最後の呼び出し):ワークループ内のファイル "c:\ program files \ python36 \ lib \ site-packages \ billiard \ pool.py"、行359結果=(True、prepare_result(fun( args、** kwargs)))
_fast_trace_taskのファイル "c:\ program files \ python36 \ lib \ site-packages \ celery \ app \ trace.py"、行518
タスク、受け入れ、ホスト名= _loc
ValueError:解凍するのに十分な値がありません(予想3、0を取得)

修正

プルリクエスト#4078を参照してください

Documentation Windows Not a Bug

最も参考になるコメント

確認する必要があります:このバグはに表示されます

Celery 4.1.0
Windows 10 Enterprise 64 bit

コマンドを実行するときcelery -A <mymodule> worker -l info

および次の回避策が機能します。

pip install eventlet
celery -A <mymodule> worker -l info -P eventlet

全てのコメント13件

FWIWイベントレットプールの実装(「-Peventlet」コマンドラインオプション)を使用してこれを回避しました。

@drewdoggのソリューションは、チュートリアルで言及する必要があります。

確認する必要があります:このバグはに表示されます

Celery 4.1.0
Windows 10 Enterprise 64 bit

コマンドを実行するときcelery -A <mymodule> worker -l info

および次の回避策が機能します。

pip install eventlet
celery -A <mymodule> worker -l info -P eventlet

ワーカーインスタンスのFORKED_BY_MULTIPROCESSING = 1環境変数を定義するだけで十分です。

@auvipy私のために働いてくれてありがとう。

@auvipyそれは本当に問題を解決します:)👍
追加:
OSのインポート
os.environ.setdefault( 'FORKED_BY_MULTIPROCESSING'、 '1')
セロリのインスタンスを定義する前に

多分これはドキュメントで言及されるべきですか? @wonderfulsuccessはプルリクエストを送信しますか?

@wonderfulsuccess

本当にありがとう

@auvipyそれは本当に問題を解決します
追加:
OSのインポート
os.environ.setdefault( 'FORKED_BY_MULTIPROCESSING'、 '1')
セロリのインスタンスを定義する前に

動作してくれてありがとう!

@auvipyこれが修正するコードが1行しかない場合は、ドキュメントを使用してユーザーに回避策の実装を推奨するのではなく、セロリ内で修正しないのはなぜですか? このような単純な修正で完全にプラットフォームを壊すバグが、2年近く経ってもまだ問題であるのはなぜですか?

セロリはどこにこれを置くことができますか? これはWindows固有の命令に適していると思います。 コードレベルで修正したい場合は、適切なPRを用意してください。

@auvipyそれは本当に問題を解決します:)👍
追加:
OSのインポート
os.environ.setdefault( 'FORKED_BY_MULTIPROCESSING'、 '1')
セロリのインスタンスを定義する前に

あなたは素晴らしいです、トンに感謝します!

@auvipy私はこの問題への答えを探してきました、私はこれを修正しようと多くの時間を費やしました、どうもありがとうございました

このページは役に立ちましたか?
0 / 5 - 0 評価