扭曲的线程池导入失败

时间:2014-09-15 13:39:01

标签: twisted python-import graphite pypy

背景:

我正在尝试使用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安装扭曲,低语(并应用额外的patch

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

修改

  • virtualenv名为test2。

  • test2 / site-packages / twisted / python / threadpool.py {,c}显示twisted has threadpool

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

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

EDIT2:

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

2 个答案:

答案 0 :(得分:2)

你的Twisted安装是否有线程池模块?在threadpool.py目录中查找名为twisted/python/的文件。如果缺少这个,你的Twisted安装已经被破坏了。您可以通过重新安装Twisted来修复它(可能会破坏你的...... virtualenv?并创建一个新的)。

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

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

如果这没有帮助,那么你也可以尝试在导入twisted.python.threadpool模块之前在pdb中添加一个断点,然后仔细踩一下,随时检查状态。要检查的一件事可能是sys.modules是否有'twisted.python.threadpool&#39;已经存在的项目,如果已​​经存在,则与之关联的值是什么。 None将阻止导入系统甚至在磁盘上查找模块实现并且只是失败。

答案 1 :(得分:2)

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