【问题标题】:twisted threadpool import fail扭曲的线程池导入失败
【发布时间】:2014-11-14 06:52:25
【问题描述】:

上下文:

我正在尝试使用 pypy 解释器启动石墨。

错误:

启动石墨(*)导致

ImportError: cannot import name 'threadpool',

即使启动 python (pypy) 解释器并输入 from twisted.python import threadpool 也可以。

完整的堆栈跟踪:

15/09/2014 13:29:09 ::   File "app_main.py", line 75, in run_toplevel
15/09/2014 13:29:09 ::   File "/opt/graphite/bin/carbon-cache.py", line 30, in <module>
15/09/2014 13:29:09 ::     run_twistd_plugin(__file__)
15/09/2014 13:29:09 ::   File "/opt/graphite/lib/carbon/util.py", line 93, in run_twistd_plugin
15/09/2014 13:29:09 ::     runApp(config)
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/scripts/twistd.py", line 23, in runApp
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/application/app.py", line 380, in run
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/scripts/_twistd_unix.py", line 193, in postApplication
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/scripts/_twistd_unix.py", line 390, in startApplication
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/application/app.py", line 658, in startApplication
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/application/service.py", line 282, in startService
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/application/service.py", line 282, in startService
15/09/2014 13:29:09 ::   File "/opt/graphite/lib/carbon/writer.py", line 191, in startService
15/09/2014 13:29:09 ::     reactor.callInThread(writeForever)
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 997, in callInThread
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 989, in getThreadPool
15/09/2014 13:29:09 ::   File "/home/vagrant/test2/site-packages/twisted/internet/base.py", line 954, in _initThreadPool
15/09/2014 13:29:09 :: ImportError: cannot import name 'threadpool'

我在 centos 6.5 上使用 pypy (2.3.1-linux_x86_64-portable) 并运行 pip 来安装twis​​ted、whisper(并应用了额外的patch

(*) test2/bin/python /opt/graphite/bin/carbon-cache.py --instance=a start

编辑:

  • virtualenv 被称为 test2。

  • test2/site-packages/twisted/python/threadpool.py{,c} 显示twisted 有线程池

  • test2/bin/pypy --info 显示[usemodules] thread = True

  • 'twisted.python.threadpool' in sys.modules 在导入失败之前返回 false

编辑2:

在调用堆栈的前面添加from twisted.python import threadpool(例如在 /opt/graphite/lib/carbon/util.py 中)可以使石墨工作。

【问题讨论】:

    标签: twisted python-import graphite pypy


    【解决方案1】:

    您安装的 Twisted 是否有线程池模块?在twisted/python/ 目录中查找名为threadpool.py 的文件。如果缺少此信息,则您的 Twisted 安装已以某种方式损坏。您也许可以通过重新安装 Twisted 来修复它(可能会破坏您的 ... virtualenv?并创建一个新的)。

    它有 stdlib 线程模块吗? Twisted 的线程支持仅在底层 Python 运行时支持线程时才有效。如果缺少这个,你可能需要一个不同的 Python 运行时。 PyPy 支持线程,但也许您的构建以某种方式禁用了线程。

    如果这些都不是问题,您可以通过启用导入调试运行 Python 来了解更多信息。 python -v 启用最小的导入调试,python -vv 启用更详细的导入调试。我不确定这些在 PyPy 上的行为是否与在 CPython 上的行为相同。希望他们能做到,否则事情会更困难一些。

    如果这没有帮助,那么您也可以尝试在导入 twisted.python.threadpool 模块之前使用 pdb 添加一个断点,然后小心地逐步执行,随时检查状态。要检查的一件事可能是sys.modules 中是否已经有一个'twisted.python.threadpool' 项目,如果是,则与它相关联的值是什么。 None 将阻止导入系统甚至在磁盘上查找模块实现并失败。

    【讨论】:

    • test2/site-packages/twisted/python/threadpool.py{,c} 存在
    • test2/include/pythread.h 提示支持线程?
    • 所有死胡同。 -v-vv 的时间可能。
    • 很遗憾,pypy 似乎不支持 -v
    【解决方案2】:

    我遇到了类似的问题。问题是在 carbon.conf 的 USER 设置中,我指定了我自己的用户“graphite”。执行此操作时,carbon-cache 守护程序将以该用户身份运行。石墨用户没有扭曲模块的权限。解决方案是 chown -R 石墨 /usr/lib64/python2.6/site-packages/twisted

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      相关资源
      最近更新 更多