这个问题由此而生。简而言之,我使用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对象)有一个参数,该参数在收到n 条stop_after=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]
如何提高预判能力?
从迭代器获取一个元素的最简单方法可能是这样的:
好吧,或者甚至只是
总的来说,您的所有方法也都适用,只是它们包含更多代码并且在某处创建了不必要的列表实体。这种方法比较简单。