Django 芹菜错误:“;没有名为“台球.分叉”的模块如何诊断?

Django 芹菜错误:“;没有名为“台球.分叉”的模块如何诊断?,django,celery,egg,fork,Django,Celery,Egg,Fork,我不知道从哪里开始诊断和修复: $ bin/django celeryd -l DEBUG -v 3 -------------- celery@lucid32 v3.0.3 (Chiastic Slide) ---- **** ----- --- * *** * -- [Configuration] -- * - **** --- . broker: django://localhost// - ** ---------- . app: default: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
...
$bin/django celeryd-l调试-v3
-------------- celery@lucid32v3.0.3(交叉滑动)
---- **** ----- 
---***-[配置]
-- * - **** --- . 经纪人:django://localhost//
- ** ---------- . 应用程序:默认值:0x8b0aa4c(djcelery.loaders.DjangoLoader)
- ** ---------- . 并发性:1(进程)
- ** ---------- . 事件:关闭(启用-E以监视此工作进程)
- ** ---------- 
-***-***-[队列]
-- ******* ---- . 芹菜:交换:芹菜(直接)装订:芹菜
--- ***** ----- 
[任务]
. 芹菜
. 芹菜串
. 芹菜
. 芹菜
. 芹菜块
. 芹菜组
. 芹菜地图
. 芹菜星图
. tardis_门户。制作本地副本
. tardis_portal.verify_as_remote
. tardis_portal.verify_文件
正在加载模块。
[2012-07-2518:27:37173:DEBUG/MainProcess][Worker]声明组件。
[2012-07-25 18:27:37173:DEBUG/MainProcess][Worker]构建引导步骤图。
[2012-07-2518:27:37173:DEBUG/MainProcess][Worker]新的启动顺序:{ev、队列、池、中介、beat、自动读卡器、计时器、状态数据库、自动缩放器、消费者}
[2012-07-2518:27:37174:DEBUG/MainProcess]正在启动芹菜。并发。进程。任务池。。。
[2012-07-2518:27:37229:DEBUG/MainProcess]芹菜。并发。进程。任务池OK!
[2012-07-2518:27:37233:DEBUG/MainProcess]正在启动芹菜.工人.调解员.调解员。。。
[2012-07-2518:27:37235:DEBUG/MainProcess]cellery.worker.mediator.mediator好的!
[2012-07-2518:27:37236:调试/主进程]正在启动芹菜.工人.消费者.阻止消费者。。。
[2012-07-2518:27:37236:警告/主流程]celery@lucid32已经开始了。
[2012-07-25 18:27:37237:DEBUG/MainProcess]使用者:重新建立与代理的连接。。。
[2012-07-25 18:27:37242:调试/主进程]使用者:已建立连接。
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为billiard.forking的模块
[2012-07-25 18:27:37287:调试/主进程]使用者:基本。qos:预取计数->4
[2012-07-25 18:27:37298:调试/主进程]使用者:准备接受任务!
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为billiard.forking的模块
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为billiard.forking的模块
...
我不知道什么是台球,除了它是Django使用的一些进程多工作组件。由于给出的上下文太少,我不知道是Django还是我的应用程序中出现了错误

相应的forking.py出现在
/eggs/billiard-2.7.3.10-py2.6-linux-i686.egg/
中。运行
bin/django shell
然后
导入台球。forking
正确执行

所以,可能有一些子进程是在错误的环境中生成的,并且没有找到台球分叉


应用程序是。

好的,我克服了第一个障碍。天真的方法奏效了:grep整个源代码树,包括用于“台球分叉”的鸡蛋。令人惊讶的是,它出现的唯一位置是在分叉模块内部:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为billiard.forking的模块

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

好吧,我已经越过了第一个障碍。天真的方法奏效了:grep整个源代码树,包括用于“台球分叉”的鸡蛋。令人惊讶的是,它出现的唯一位置是在分叉模块内部:

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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:没有名为billiard.forking的模块

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

重要的恐惧是从台球分叉时创建的子进程中产生的。当这些进程的sys.path上没有台球时,就会产生importorror,这可能发生在我现在知道的两种情况中

第一个是您的情况,因为Django正在损坏(然后取消损坏)sys.path,如中所述。解决方法是按照该线程中的描述显式修复sys.path

第二种情况是发生在我身上的,导致我发现这个问题,是因为你在一个virtualenv中,出于某种原因它没有被激活用于子进程


芹菜(也就是叫台球的东西)在“#!/usr/bin/env python2.6”下运行,因此如果您的virtualenv是在没有python2.6二进制文件的情况下创建的(可能它只有‘python’),那么子进程将退回到使用系统的python2.6,因为它不会安装台球。这实际上有时会发生(对我来说也是如此)——我打开了一个针对virtualenv的pull请求,希望能够删除其中一些情况:

ImportError是从billiard分叉时创建的子进程中引发的。当这些进程的sys.path上没有台球时,就会产生importorror,这可能发生在我现在知道的两种情况中

第一个是您的情况,因为Django正在损坏(然后取消损坏)sys.path,如中所述。解决方法是按照该线程中的描述显式修复sys.path

第二种情况是发生在我身上的,导致我发现这个问题,是因为你在一个virtualenv中,出于某种原因它没有被激活用于子进程

芹菜(被称为台球的东西)在“#!/usr/bin”下面/