0

これを診断して修正する場所がわかりません:

$  bin/django celeryd -l DEBUG -v 3


 -------------- celery@lucid32 v3.0.3 (Chiastic Slide)
---- **** ----- 
--- * ***  * -- [Configuration]
-- * - **** --- . broker:      django://localhost//
- ** ---------- . app:         default:0x8b0aa4c (djcelery.loaders.DjangoLoader)
- ** ---------- . concurrency: 1 (processes)
- ** ---------- . events:      OFF (enable -E to monitor this worker)
- ** ---------- 
- *** --- * --- [Queues]
-- ******* ---- . celery:      exchange:celery(direct) binding:celery
--- ***** ----- 

[Tasks]
  . celery.backend_cleanup
  . celery.chain
  . celery.chord
  . celery.chord_unlock
  . celery.chunks
  . celery.group
  . celery.map
  . celery.starmap
  . tardis_portal.make_local_copy
  . tardis_portal.verify_as_remote
  . tardis_portal.verify_files

[2012-07-25 18:27:37,168: DEBUG/MainProcess] [Worker] Loading modules.
[2012-07-25 18:27:37,173: DEBUG/MainProcess] [Worker] Claiming components.
[2012-07-25 18:27:37,173: DEBUG/MainProcess] [Worker] Building boot step graph.
[2012-07-25 18:27:37,173: DEBUG/MainProcess] [Worker] New boot order: {ev, queues, pool, mediator, beat, autoreloader, timers, state-db, autoscaler, consumer}
[2012-07-25 18:27:37,174: DEBUG/MainProcess] Starting celery.concurrency.processes.TaskPool...
[2012-07-25 18:27:37,229: DEBUG/MainProcess] celery.concurrency.processes.TaskPool OK!
[2012-07-25 18:27:37,233: DEBUG/MainProcess] Starting celery.worker.mediator.Mediator...
[2012-07-25 18:27:37,235: DEBUG/MainProcess] celery.worker.mediator.Mediator OK!
[2012-07-25 18:27:37,236: DEBUG/MainProcess] Starting celery.worker.consumer.BlockingConsumer...
[2012-07-25 18:27:37,236: WARNING/MainProcess] celery@lucid32 has started.
[2012-07-25 18:27:37,237: DEBUG/MainProcess] Consumer: Re-establishing connection to the broker...
[2012-07-25 18:27:37,242: DEBUG/MainProcess] Consumer: Connection established.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named billiard.forking
[2012-07-25 18:27:37,287: DEBUG/MainProcess] Consumer: basic.qos: prefetch_count->4
[2012-07-25 18:27:37,298: DEBUG/MainProcess] Consumer: Ready to accept tasks!
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named billiard.forking
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named billiard.forking
...

Django で使用されるプロセス マルチフォーク コンポーネントであること以外は、ビリヤードが何であるかはわかりません。与えられたコンテキストがほとんどないため、Django でエラーを見ているのか、アプリでエラーを見ているのかわかりません。

適切な forking.py が にあり./eggs/billiard-2.7.3.10-py2.6-linux-i686.egg/ます。実行するbin/django shellと、import billiard.forking正しく実行されます。

したがって、おそらくいくつかの子プロセスが間違った環境で生成され、billiard.forking が見つからない可能性があります。

申し込みはこちら

4

2 に答える 2

4

ImportError は、ビリヤードが fork するときに作成しているサブプロセスから発生しています。ImportError は、これらのプロセスの sys.path にビリヤードがない場合に発生します。これは、私が現在知っている 2 つのケースで発生する可能性があります。

最初のケースは、 https: //github.com/celery/billiard/issues/10 で説明されているように、Django が sys.path をマングリング (およびアンマングリング) しているためです。回避策は、そのスレッドで説明されているように sys.path を明示的に修正することです。

2番目は、私に起こったケースであり、この質問を見つけさせたのは、あなたがvirtualenvにいて、何らかの理由でサブプロセスに対してアクティブ化されていないためです。

Celery (これはビリヤードを呼び出すものです) は "#!/usr/bin/env python2.6" の下で実行されるため、virtualenv が python2.6 バイナリなしで作成された場合 (おそらく 'python' しかありません)、サブプロセスはビリヤードがインストールされていないシステムの python2.6 を使用するようにフォールバックします。これは実際に時々発生する可能性があります(そして私に起こりました)-これらのケースのいくつかを削除できることを願って、virtualenvに対してプルリクエストを開きました:https://github.com/pypa/virtualenv/pull/341

于 2012-10-09T15:34:38.527 に答える
0

よし、最初のハードルを越えた。素朴なアプローチがうまくいきました。「billiard.forking」について、卵を含むソースツリー全体を grep します。驚くべきことに、それが表示される唯一の場所は forking モジュール自体の内部です。

if getattr(sys, 'frozen', False):
    return [sys.executable, '--billiard-fork']
else:
    prog = 'from billiard.forking import main; main()'
    return [_python_exe, '-c', prog, '--billiard-fork']

間違いなくこれが原因です。実行時に、そのコードはこれを返します。

/usr/bin/python -c "from billiard.forking import main; main()" --billiard-fork

予想通り:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named billiard.forking

なぜ、またはこのコードが何を意味するのかはわかりませんが、「どこから始めればよいかわからない」段階を過ぎています。

于 2012-07-25T10:39:03.540 に答える