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

我不知道 Billiard 是什么,除了它是 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 是从台球分叉时创建的子流程中引发的。当这些进程的 sys.path 上没有台球时会引发 ImportError,这可能在我现在知道的两种情况下发生。

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

第二种,就是发生在我身上的情况,导致我发现这个问题,是因为你在一个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

好的,我克服了第一个障碍。天真的方法奏效了: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

我不知道为什么,也不知道这段代码是做什么的,但我已经过了“我不知道从哪里开始”的阶段。

于 2012-07-25T10:39:03.540 回答