2016-09-14 96 views
1

这里是我的代码,我想要my_reader等待最多5秒钟,然后再用my_future.result()做一些事情。请注意,my_reader不是 a 协同程序,它是回调Python - asyncio - 在回调中等待未来

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

对不起,在等待回调是不可能的。 应根据定义立即执行回调 - 否则事件循环在回调执行期间挂起。

你的逻辑应该建立在协同程序但低级别on_read回调可以通过设置未来的价值通知这些协同程序。

查看aiopg.connection获得灵感。回调名为Connection._ready

+0

为什么'add_reader'不接受协同程序? –

+0

这是非常低级别的API(如'asyncio.Protocol' BTW)。 协程在更高层次上运行。 –