Является ли twisted.internet.reactor глобальным? - PullRequest
8 голосов
/ 06 августа 2010

Например, если одно приложение делает from twisted.internet import reactor, а другое приложение делает то же самое, это reactors то же самое?

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

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

Ответы [ 2 ]

14 голосов
/ 06 августа 2010

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

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

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

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

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

2 голосов
/ 06 августа 2010

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

...