Как импортировать асинхронный модуль Python из рабочего потока? - PullRequest
4 голосов
/ 07 сентября 2010

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

1 Ответ

0 голосов
/ 20 сентября 2010

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

...