Я использую пакет 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
также завершится ошибкой.
Можете ли вы придумать какой-нибудь приличный способ обойти/обойти эту проблему?
Обновление: я заметил, что mod_wsgi Apache достаточно умен, чтобы игнорировать вызов signal
:
[Tue Sep 07 19:53:11 2010] [warn] mod_wsgi (pid=28595): Callback registration for signal 2 ignored.
Однако проблема остается с сервером разработки Django.