Я использую пакет GitPython для доступа к Git-репозиторию из Python. Это включает в себя асинхронный пакет . В 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.