2010-08-06 26 views
8

Par exemple, si une application fait from twisted.internet import reactor, et une autre application fait la même chose, sont-elles reactors la même chose?Est-ce que twisted.internet.reactor est global?

Je demande parce que Deluge, une application qui utilise tordu, on dirait qu'il utilise le réacteur pour connecter leur interface utilisateur (gtk) au reste de l'application étant entraîné par torsadé (j'essaie de comprendre la source). Par exemple, lorsque l'interface utilisateur est fermée, elle appelle simplement reactor.stop().

Est-ce tout ce qu'il ya à faire? Cela me semble plutôt magique. Et si je voulais lancer une autre application qui utilise tordu?

+0

Qu'entendez-vous par 'application'? Voulez-vous dire des processus Python distincts ou plusieurs choses en cours d'exécution dans un seul processus? –

Répondre

13

Oui, chaque module en Python est toujours global, ou, pour mieux dire, singleton: lorsque vous faites from twisted.internet import reactor, le mécanisme d'importation de Python vérifie d'abord sys.modules['twisted.internet.reactor'], et, si cela existe, renvoie cette valeur; seulement s'il n'existe pas (c'est-à-dire, la première fois qu'un module est importé) est le module réellement chargé pour la première fois (et stocké dans une entrée dans sys.modules pour d'éventuelles importations futures). Il n'y a rien de particulièrement magique dans le motif de conception de Singleton, bien qu'il puisse parfois s'avérer limitatif lorsque vous avez désespérément besoin de plus d'un de ces trucs pour lesquels l'architecture a décrété "il ne peut y en avoir qu'un". Twisted de docs Reconnais que:

Nouveau code d'application doit préférer passe et accepter le réacteur en tant que paramètre où il est nécessaire, plutôt que de compter sur la possibilité d'importer ce module pour obtenir une référence. Ce simplifie les tests unitaires et peut rendre plus facile de supporter un jour plusieurs réacteurs (comme amélioration de la performance ), bien que ce ne soit pas actuellement possible.

La meilleure façon de le rendre possible, s'il est crucial de votre application, est de contribuer au projet Twisted, soit la main-d'œuvre (coder les mécanismes subtils nécessaires pour soutenir plusieurs réacteurs, qui est, des boucles d'événements multiples, au sein une seule application) ou de financement (l'argent permettra de soutenir quelqu'un avec une allocation pour effectuer ce travail).

Sinon, utilisez des processus séparés (par exemple avec le module multiprocessing de la bibliothèque standard) avec pas plus d'un réacteur chacun.