2010-08-06 5 views
8

Например, если одно приложение делает from twisted.internet import reactor, а другое приложение делает то же самое: reactors то же самое?Является ли twisted.internet.reactor глобальным?

Я спрашиваю, потому что Deluge, приложение, которое использует скрученный, похоже, что он использует реактор для подключения своего интерфейса (gtk) к остальной части приложения, управляемой скрученной (я пытаюсь понять источник). Например, когда пользовательский интерфейс закрыт, он просто вызывает reactor.stop().

Это все, что с ним связано? Для меня это просто волшебство. Что делать, если я хотел запустить другое приложение, которое использует скрученный?

+0

Что вы имеете в виду под «заявлением»? Вы имеете в виду отдельные процессы Python или несколько вещей, выполняемых в одном процессе? –

ответ

13

Да, каждый модуль в Python всегда является глобальным или, если можно так выразиться, singleton: когда вы делаете from twisted.internet import reactor, механизм импорта Python сначала проверяет sys.modules['twisted.internet.reactor'] и, если он существует, возвращает указанное значение; только если он не существует (т. е. при первом вводе модуля) - это действительно загруженный в первый раз модуль (и спрятанный в запись в sys.modules для возможного будущего импорта).

В шаблоне дизайна Singleton нет ничего особенного, хотя иногда это может оказаться ограничивающим, когда вам отчаянно нужно больше, чем одна из тех штучек, для которых архитектура постановила «может быть только одна». Twisted-х docs признают, что:

Новый код приложения должен предпочесть проход и принять реактор в качестве параметра, где это необходимо, а , чем полагаться на возможность импортировать этот модуль, чтобы получить ссылку. Это упрощает модульные испытания и может сделать проще в один прекрасный день поддерживать несколько реакторов (как производительность ), хотя в настоящее время это не .

Лучший способ сделать это возможным, если это важно для вашего приложения, чтобы внести свой вклад в Twisted проекта, либо труда (кодирование тонкие механизмы, необходимые для поддержки нескольких реакторов, то есть несколько циклов событий, в пределах одно приложение) или финансирование (деньги позволят поддерживать кого-то с стипендией для выполнения этой работы).

В противном случае используйте отдельные процессы (например, с модулем multiprocessing стандартной библиотеки) с объемом не более одного реактора.

2

Реактор действительно глобальный. Он заботится о цикле событий, и вы регистрируете обработчики для использования событий. Если вы хотите использовать несколько приложений с одним и тем же реактором, вы можете использовать демон twistd. http://twistedmatrix.com/documents/current/core/howto/application.html

Смежные вопросы