如何从工作线程导入Python异步模块?
我正在使用GitPython包来通过Python访问一个Git仓库。这个包会引入async包。在async/__init__.py
文件中,发生了以下事情:
def _init_signals():
"""Assure we shutdown our threads correctly when being interrupted"""
import signal
# ...
signal.signal(signal.SIGINT, thread_interrupt_handler)
_init_signals()
如果所有操作都在主线程中进行,这一切都运行得很好。但是,当第一次在另一个线程中导入git
(也就是async
)时,事情就出问题了:
ValueError: signal only works in main thread
因为这一切都是在Django框架内运行的,所以我无法控制线程。
我找到的一个解决办法是把import async
放到settings.py
里,这样它就会在主线程中被导入(显然)。不过,这需要在每次安装时都这样做,所以对我的Django应用的用户来说,这并不是很友好。
我尝试捕获异常,但如果导入时发生异常,导入过程不会完全完成,所以下一个import async
也会失败。
你能想到什么比较好的方法来解决这个问题吗?
更新:我注意到Apache的mod_wsgi足够聪明,可以忽略signal
调用:
[Tue Sep 07 19:53:11 2010] [warn] mod_wsgi (pid=28595): Callback registration for signal 2 ignored.
不过,Django开发服务器的问题依然存在。