Да, каждый модуль в Python всегда глобален или, проще говоря, одноэлементен: когда вы делаете from twisted.internet import reactor
, механизм импорта Python сначала проверяет sys.modules['twisted.internet.reactor']
и, если таковой существует, возвращает указанное значение;только если он не существует (то есть, когда модуль импортируется в первый раз), модуль фактически загружается впервые (и сохраняется в записи в sys.modules
для возможного импорта в будущем).
ТамНичто особенно не волшебно в шаблоне проектирования Singleton, хотя иногда он может оказаться ограничивающим, когда вам отчаянно нужно больше, чем одна из тех вещей, для которых архитектура решила, что «может быть только одна». документы Twisted подтверждают, что:
Новый код приложения должен предпочитать передавать и принимать реактор в качестве параметра, где он необходим, а не полагаться на возможность импортировать этот модуль вполучить ссылку.Это упрощает модульное тестирование и может упростить однодневную поддержку нескольких реакторов (как повышение производительности), хотя в настоящее время это невозможно.
Лучший способ сделать это возможным, если важноВаше приложение должно внести свой вклад в проект Twisted, либо труд (кодирование тонких механизмов, необходимых для поддержки нескольких реакторов, то есть нескольких циклов событий, в одном приложении), либо финансирование (деньги позволят поддерживать кого-то со стипендией, чтобывыполнить эту работу).
В противном случае использовать отдельные процессы (например, с модулем multiprocessing
стандартной библиотеки), в которых не более одного реактора каждый.