如何从工作线程导入Python异步模块?

时间:2010-09-07 10:20:22

标签: python multithreading asynchronous signals gitpython

我正在使用GitPython package从Python访问Git存储库。这会引入async package。在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开发服务器上。

1 个答案:

答案 0 :(得分:0)

如果您从git中提取最新的异步代码,我怀疑这将为您修复,并在patch

中被称为非致命错误