Как обрабатывать входящие сообщения PubSub в Python?

как я могу это сделать?

У вас уже есть ответы на то, что вы должны делать, но не почему, поэтому я собираюсь добавить почему.

Причина, по которой вы не изменяете элементы GUI из другого потока, состоит в том, что элементы GUI обычно не являются потокобезопасными . Это означает, что если ваш основной поток GUI и рабочий поток обновляют пользовательский интерфейс, вы не можете быть уверены в том, что произошло, когда.

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

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

На этом этапе вы можете подумать: черт возьми, этот бизнес потоков farrrrrr слишком много работы! Я просто избегу этого. Чтобы понять, почему это плохая идея, реализуйте программу копирования файлов в одном потоке с простым индикатором выполнения, сообщающим вам, насколько далеко находится копия. Запустите его в большом файле. В Windows через некоторое время приложение «пойдет белым» (или на XP, я думаю, оно станет серым) и будет «не отвечать». Это очень буквально то, что происходит.

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

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

1
задан Larry Cai 17 January 2019 в 08:11
поделиться

1 ответ

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

Смотрите пример здесь: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/pubsub/cloud-client/subscriber.py , а также различия нажмите и потяните здесь: https://cloud.google.com/pubsub/docs/subscriber

0
ответ дан Dustin Ingram 17 January 2019 в 08:11
поделиться
Другие вопросы по тегам:

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