Python - asyncio - 在回调中等待未来

时间:2016-09-14 14:07:28

标签: python python-3.5 python-asyncio

这是我的代码,我希望my_reader等待最多5秒,然后再使用my_future.result()执行某些操作。请注意my_reader coroutine 回调

import asyncio, socket

sock = ...

async def my_coroutine():
    ...

def my_reader():
    my_future = asyncio.Future()
    ...

    # I want to wait (with a timeout) for my_future


loop = asyncio.get_event_loop()
loop.add_reader(sock, my_reader)
loop.run_forever()
loop.close()

我不想使用:

  • AbstractEventLoop.create_datagram_endpoint()
  • AbstractEventLoop.create_connection()
  • ...

我的套接字从另一个模块返回,我必须读取给定大小的数据包。转移必须在5秒内完成。

如何在回调中等待未来?

2 个答案:

答案 0 :(得分:2)

抱歉,等待回调是不可能的。 应该通过定义立即执行回调 - 否则事件循环会在回调执行期间挂起。

您的逻辑应基于 coroutines ,但低级 on_read 回调可以通过设置未来值来通知这些协程。

请参阅aiopg.connection获取灵感。回调名为Connection._ready

答案 1 :(得分:0)

您应该单独运行协同程序,并通过队列从回调中向其发送数据。

看看这个答案:

https://stackoverflow.com/a/29475218/1112457