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.
Qu'entendez-vous par 'application'? Voulez-vous dire des processus Python distincts ou plusieurs choses en cours d'exécution dans un seul processus? –