2016-09-14 5 views
1

Вот мой код, я хочу my_reader ждать максимум 5 секунд для будущего, а затем что-то делать с my_future.result(). Обратите внимание, что my_reader является не a coroutine, это callback.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()
  • ...

Гнездо у меня возвращается из другого модуля и I должны читать пакеты с заданным размером. Передача должна произойти менее 5 секунд.

Как подождать будущее внутри обратного вызова?

ответ

2

Жаль, ожидая в callbacks невозможно. Обратный вызов должен выполняться мгновенно по определению - в противном случае цикл событий зависает во время выполнения обратного вызова.

Ваша логика должна быть построена на сопрограмм но низкоуровневый on_read обратного вызов может сообщить эти сопрограмм, установив значение будущего.

См. aiopg.connection для вдохновения. Обратный вызов называется Connection._ready.

+0

почему 'add_reader' не принимает сопрограмм? –

+0

Это очень низкий уровень API (например, 'asyncio.Protocol' BTW). Coroutines работают на более высоких уровнях. –

Смежные вопросы