Python - asyncio - 在回调中等待未来
Python - asyncio - Wait for a future inside a callback
这是我的代码,我希望 my_reader
最多等待 5 秒,然后用 my_future.result()
做一些事情。请注意 my_reader
是 不是 一个 coroutine,它是一个 callback.
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 秒内完成。
如何在回调中等待未来?
抱歉,无法等待 回调。
根据定义,回调应该立即执行——否则事件循环会在回调执行期间挂起。
你的逻辑应该建立在 coroutines 但低级 on_read 回调可以通过设置一个值来通知这些协程未来。
请参阅 aiopg.connection 以获取灵感。回调名为 Connection._ready
.
您应该 运行 协程单独并通过队列从回调中向其发送数据。
看看这个答案:
这是我的代码,我希望 my_reader
最多等待 5 秒,然后用 my_future.result()
做一些事情。请注意 my_reader
是 不是 一个 coroutine,它是一个 callback.
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 秒内完成。
如何在回调中等待未来?
抱歉,无法等待 回调。 根据定义,回调应该立即执行——否则事件循环会在回调执行期间挂起。
你的逻辑应该建立在 coroutines 但低级 on_read 回调可以通过设置一个值来通知这些协程未来。
请参阅 aiopg.connection 以获取灵感。回调名为 Connection._ready
.
您应该 运行 协程单独并通过队列从回调中向其发送数据。
看看这个答案: