Skip to main content
 首页 » 编程设计

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

2025年05月04日9傻小

为什么在 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) 调用它,它将尝试调用并运行该函数(即使它是协程/异步函数)