Действительно ли twisted.internet.reactor глобален?

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

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

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

8
задан lightweight 6 August 2010 в 14:39
поделиться

2 ответа

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

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

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

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

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

14
ответ дан 5 December 2019 в 10:38
поделиться

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

2
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: