芹菜错误:“没有名为billiard.forking的模块” - 如何诊断?

时间:2012-07-25 09:07:09

标签: django celery egg fork

我不知道从哪里开始诊断并解决这个问题:

$  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
...

我不知道Billiard是什么,除了它是Django使用的一些过程多用途组件。由于给出的上下文很少,我不知道我是在看Django还是在我的应用程序中出错。

./eggs/billiard-2.7.3.10-py2.6-linux-i686.egg/中存在适当的forking.py。运行bin/django shell然后import billiard.forking正确执行。

所以,大概有些儿童过程是在错误的环境中产生的,而没有找到billiard.forking。

该应用程序为here

2 个答案:

答案 0 :(得分:4)

正在从台湾正在创建的子过程中引发ImportError。当这些进程在他们的sys.path上没有台球时会引发ImportError,这可能发生在我现在知道的两种情况中。

首先,这是你的情况,因为Django正在修改(然后取消修改)sys.path,如https://github.com/celery/billiard/issues/10中所述。解决方法是显式修复sys.path,如该线程中所述。

第二个,就是发生在我身上的情况,并且让我发现这个问题,是因为你处于一个虚拟现实中,并且由于某种原因它没有被激活用于子流程。

Celery(称为台球的东西)在&#34;#!/ usr / bin / env python2.6&#34;下运行,所以如果你的virtualenv是在没有python2.6二进制文件的情况下创建的(也许它只是有了#python&#39;),子进程将回退到使用系统的python2.6,它不会安装台球。这实际上有时会发生(并且发生在我身上) - 我已经打开了针对virtualenv的拉取请求,希望能够删除其中一些案例:https://github.com/pypa/virtualenv/pull/341

答案 1 :(得分:0)

好吧,我克服了第一道障碍。天真的方法有效:grep整个源树,包括鸡蛋,用于“billiard.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

我不知道为什么,或者这段代码的意图,但我已经过了“我不知道从哪里开始”的阶段。