2010-09-07 5 views
4

J'utilise le GitPython package pour accéder à un référentiel Git à partir de Python. Cela tire dans le async package. En async/__init__.py, ce qui suit se produit:Comment importer le module asynchrone Python à partir d'un thread de travail?

def _init_signals(): 
    """Assure we shutdown our threads correctly when being interrupted""" 
    import signal 
    # ... 
    signal.signal(signal.SIGINT, thread_interrupt_handler) 

_init_signals() 

Cela fonctionne bien si tout est dans le thread principal. Cependant, lorsque la première importation de git (et donc async) se produit sur un autre fil, les choses vont-boom:

ValueError: signal only works in main thread 

Comme tout cela fonctionne à l'intérieur du framework Django, je n'ai aucun contrôle sur le filetage.

Une solution de contournement que j'ai trouvé est de mettre import async dans settings.py, qui est (apparemment) importé sur le thread principal. Cependant, cela doit être fait sur une base par installation, donc ce n'est pas très agréable pour les utilisateurs de mon application Django.

J'ai essayé d'intercepter l'exception, mais une importation qui a déclenché une exception ne se termine pas complètement, donc le import async suivant échouera également. Pouvez-vous imaginer une méthode décente à mi-chemin pour travailler/contourner ce problème?


Mise à jour: Je remarque que le mod_wsgi d'Apache est assez intelligent pour ignorer l'appel signal:

[Tue Sep 07 19:53:11 2010] [warn] mod_wsgi (pid=28595): Callback registration for signal 2 ignored. 

Le problème reste avec le serveur de développement de Django, cependant.

Répondre

0

Si vous tirez le dernier code async de git, je soupçonne que ce sera fixé pour vous et est appelé comme une erreur non fatale dans le patch

+0

Ha, brillante, merci! Ce peut être une erreur non fatale, mais si 'ValueError' quitte le module,' import' échoue donc le module ne peut pas être utilisé. – Thomas

Questions connexes