Как импортировать асинхронный модуль Python из рабочего потока?

Я использую пакет 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.


person Thomas    schedule 07.09.2010    source источник


Ответы (1)


Если вы вытащите последний асинхронный код из git, я подозреваю, что это будет исправлено для вас и будет вызвано как нефатальная ошибка в patch

person synthesizerpatel    schedule 20.09.2010
comment
Ха, гениально, спасибо! Это может быть нефатальная ошибка, но если ValueError покидает модуль, import выходит из строя, поэтому модуль нельзя использовать. - person Thomas; 21.09.2010