1. ホーム
  2. パイソン

Celery ValueErrorの解決策:解凍するための値が足りない(期待値3、結果0)

2022-02-23 22:36:45
<パス

背景

最近、プロジェクトのためにタスクキューCeleryの使用を学ぶ必要があり、デモを書くために公式サイトに従って、タイトルとしてエラーが発生し、最終的にgithubの問題で解決策を発見し、以下に記録された。

シーンの復元

ローカル環境は以下の通りです。

  • Windows 10
  • Python 3.5.2
  • セロリ 4.1.0

私は、次のことを行っています。 前任者が翻訳した中国語文書 デモをたたき起こしたこと。

コード tasks.py :

from celery import Celery

app = Celery('tasks', broker='redis://:[email protected]:6379/0')

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

ワーカーを実行する

celery -A tasks worker --loglevel=info

出力します。

 -------------- celery@kong9wei11 v4.1.0 (latentcall)
---- **** -----
--- * *** * -- Windows-10-10.0.14393-SP0 2018-01-12 19:01:39
-- * - **** ---
- ** ---------- [config]
- ** ---------- . > app: tasks:0x157fd248550
- ** ---------- . > transport: redis://:**@114.67.225.0:6379/0
- ** ---------- . > results: disabled://
- *** --- * --- . > concurrency: 4 (prefork)
-- ******* ---- . > task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                . > celery exchange=celery(direct) key=celery


[tasks] .
  . tasks.add

[2018-01-12 19:01:40,029: INFO/MainProcess] Connected to redis://:**@114.67.225.0:6379/0
[2018-01-12 19:01:40,130: INFO/MainProcess] mingle: searching for neighbors
[2018-01-12 19:01:40,550: INFO/SpawnPoolWorker-1] child process 9048 calling self.run()
[2018-01-12 19:01:40,557: INFO/SpawnPoolWorker-2] child process 9028 calling self.run()
[2018-01-12 19:01:40,578: INFO/SpawnPoolWorker-3] child process 13064 calling self.run()
[2018-01-12 19:01:40,611: INFO/SpawnPoolWorker-4] child process 9856 calling self.run()
[2018-01-12 19:01:41,693: INFO/MainProcess] mingle: all alone
[2018-01-12 19:01:42,212: INFO/MainProcess] celery@xx ready.

タスクコードを呼び出す manager.py :

from tasks import add

add.delay(4, 4)

実行

python manager.py

すると、workerでエラーが報告されます。

[2018-01-12 19:08:15,545: INFO/MainProcess] Received task: tasks.add[5d387722-5389-441b-9b01-a619b93b4702]
[2018-01-12 19:08:15,550: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)
Traceback (most recent call last):
  File "d:\programmingsoftware\python35\lib\site-packages\billiard\pool.py", line 358, in workloop
    result = (True, prepare_result(fun(*args, **kwargs)))
  File "d:\programmingsoftware\python35\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task
    tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)

解決策

元のページ Windowsでタスクを実行できない

Win10でcelery4.xを動かすとこの問題が発生し、解決方法がわからないと他の方の記述を読みました。

まず

`eventlet
pip install eventlet

そして、次のように引数でワーカーを起動します。

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

すると、普通に呼び出せるようになります。

実行中

python manage.py

ワーカーで出力します。

[2018-01-12 19:35:33,640: INFO/MainProcess] Received task: tasks.add[3f9b5255-60a2-4a08-96b6-38f5fbc31543]
[2018-01-12 19:35:33,640: INFO/MainProcess] Task tasks.add[3f9b5255-60a2-4a08-96b6-38f5fbc31543] succeeded in 0.0s: 8