Как оптимальнее ожидать срабатывание генератора

Этот вопрос родился вот из этого. Если коротко: я использую команды 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 шт):

Автор решения: CrazyElf

Получить один элемент из итератора проще всего так, наверное:

gen = conn.notifies(stop_after=1)
next(gen)

Ну или даже просто

next(conn.notifies(stop_after=1))

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

→ Ссылка