Await не работает с Coroutine, назначенным переменной? - PullRequest
0 голосов
/ 21 мая 2018

Почему в Python (3.6)

chunk = await evt_loop.run_in_executor(io_exec, arc.read, chunk_size)

работает точно так, как ожидалось, но

read_ftr = evt_loop.run_in_executor(io_exec, arc.read, chunk_size)
chunk = await read_ftr

выдает AssertionError ("yield from не использовался с будущим",) навторая строка, и как мне заставить его работать?

Ниже приведен фрагмент кода, который я пытаюсь запустить.Слияние трех строк read_ftr вместе, чтобы получить первую однострочную реализацию, работает, а то, как это показано ниже, приводит к ошибке подтверждения в "chunk = await read_ftr".

read_ftr: aio.Future = None
hash_ftr: aio.Future = None
chunk = None

with open(arc_path, "rb") as arc:
    while arc_offs < arc_size:
        chunk_size = min(arc_size - arc_offs, max_chunk_size)

        if read_ftr:
            chunk = await read_ftr
        read_ftr = evt_loop.run_in_executor(io_exec, arc.read, chunk_size)
        arc_offs += chunk_size

        if not chunk:
            continue

        if hash_ftr:
            await hash_ftr
        hash_ftr = hasher.async_update(chunk)

if hash_ftr:
    await hash_ftr
await hasher.async_digest()

1 Ответ

0 голосов
/ 21 мая 2018

Когда вы объявляете переменную, как вы это сделали foo_var = coroutine(args), вы фактически вызываете функцию прямо тогда и применяете ее результат к переменной.Чтобы передать функцию в качестве переменной, сделайте это как foo_var = coroutine, а затем вызовите ее с foo_var(args) каждый раз, когда вы добавляете скобки рядом с функцией, она будет пытаться вызвать и запустить эту функцию (даже если это функция сопрограммы / асинхронная функция)

...