为什么在 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/