python - 等待分配给变量的协程不起作用?

标签 python python-3.x python-asyncio

为什么在 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 wasn't used with future",),如何让它工作?

以下是我尝试运行的代码片段。将三个 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()

最佳答案

当您像foo_var = coroutine(args) 那样声明一个变量时,您实际上是在立即调用该函数并将其结果应用到该变量。要将函数作为变量传递,请将其作为 foo_var = coroutine 进行,然后在任何时候在函数旁边添加括号时使用 foo_var(args) 调用它,它将尝试调用并运行该函数(即使它是协程/异步函数)

关于python - 等待分配给变量的协程不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50450641/

相关文章:

python - 如何在特定字符(实际上是一组字符)处拆分字符串,但具有指定的长度

python - 将具有不同值的列添加到指定索引处的 csv 文件

mysql - 编程错误: You have an error in your SQL syntax; at line 1

python - 如何检查函数是否阻塞?

python - Django — async_to_sync 与 asyncio.run

python - imaplib/gmail 如何在不标记已读的情况下下载完整邮件(所有部分)

python - 如何使用 pip 安装 pygraphviz

python - capitalize 函数的较短代码

python - Django URL - 模板问题 {% url '' %}

python - 连接redis时异步代码失败