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

5 投票
1 回答
1325 浏览
提问于 2025-04-16 03:48

我正在使用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开发服务器的问题依然存在。

1 个回答

0

如果你从git上拉取最新的异步代码,我猜这个问题会对你解决,而且在这个补丁中被标记为一个非致命错误。

撰写回答