class Consumer:
... __init__() and stuff ...
async def run(self):
... Connection stuff ...
await self._queue.consume(self.handle_message)
# This part I don't understand
await self._loop.create_future()
def close(self):
self._channel.close()
self._loop.stop()
# Main part
loop = asyncio.get_event_loop()
consumer = Consumer(loop)
try:
loop.create_task(consumer.run())
loop.run_forever()
except KeyboardInterrupt:
consumer.close()
我的第一个问题是,我不明白为什么要添加该行
await self._loop.create_future()
是必要的。空虚的未来跑步看起来很奇怪。如果我删除它,它似乎工作正常。
我的第二期是,当我停止程序时,这条线会引起警告:
Task was destroyed but it is pending!
task: <Task pending name='Task-1' coro=<Consumer.run() running at scripts/consumer.py:59> wait_for=<Future pending cb=[<TaskWakeupMethWrapper object at 0x7fdbfa0134f0>()]>>
,当我将未来存储在实例属性中时,警告消失了:
self._exit = self._loop.create_future()
await self._exit
def close(self):
self._exit.cancel()
self._channel.close()
self._loop.stop()
那时我的问题是:在这一行中到底发生了什么,完全删除它是正确的吗?
# This part I don't understand
await self._loop.create_future()
IT使运行功能更新。要优雅的退出运行函数,您需要将此未来放在属性中,set_result