Как оптимальнее ожидать срабатывание генератора
Этот вопрос родился вот из этого. Если коротко: я использую команды postgresql NOTIFY / LISTEN
для организации сообщений между двумя процессами. В качестве интерфейса между python и postgersql я использую модуль psycopg
, который предлагает следующее решение по ожиданию нотификаций:
import psycopg
conn = psycopg.connect("", autocommit=True)
conn.execute("LISTEN mychan")
gen = conn.notifies()
for notify in gen:
print(notify)
if notify.payload == "stop":
gen.close()
print("there, I stopped")
Тут мы создаем генератор, который "включается", когда приходит нотификация(-ии) и ожидаем его срабатывания в цикле. Цикл блокирует поток и если не предусмотреть выход в виде gen.close()
по какому-то условию, то цикл будет ожидать бесконечно.
Моя задача чуть иная. Мне надо ожидать не всех сообщений, а только первого, причем все равно какого. Как только первое сообщение пришло, заблокированный ожиданием процесс должен продолжится. В методе conn.notifies()
(где conn
- это объект psycopg содержащий соединение с базой) есть параметр stop_after=n
, который перестает ожидать сообщения после получения n сообщений. Исходя из моей задачи, я указываю stop_after=1
и ожидаю единственного сообщения.
Вопрос. Как максимально эффективно по памяти/времени/синтаксису ожидать срабатывание этого генератора. У меня есть два решения. Первое решение, как рекомендует разработчик - через цикл.
gen = conn.notifies(stop_after=1)
for _ in gen:
pass
Так как нам все равно какое сообщение пришло, я использую безымянную переменную и в цикле ничего не делаю.
Второй вариант - создать список:
gen = conn.notifies(stop_after=1)
_ = list(gen)
# или даже вот так
_ = [1 for _ in gen]
#можно даже вот так, вообще никуда не присваивать
[1 for _ in gen]
Как улучшить ожидание?
Ответы (1 шт):
Получить один элемент из итератора проще всего так, наверное:
gen = conn.notifies(stop_after=1)
next(gen)
Ну или даже просто
next(conn.notifies(stop_after=1))
По большому счёту все ваши способы тоже годятся, только кода в них больше и где-то создаётся не нужная сущность список. Этот способ просто короче.