Python 等待不&x27;无法使用分配给变量的协同程序?
为什么在Python(3.6)中 完全按照预期工作,但是Python 等待不&x27;无法使用分配给变量的协同程序?,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,为什么在Python(3.6)中 完全按照预期工作,但是 read_ftr = evt_loop.run_in_executor(io_exec, arc.read, chunk_size) chunk = await read_ftr 在第二行抛出AssertionError(“未与future一起使用的收益率”),我如何让它工作 下面是我试图运行的代码片段。将三个read_ftr行融合在一起以获得第一个单行实现,而下面的方式会在“chunk=await read_ftr”处抛出断言错误 r
read_ftr = evt_loop.run_in_executor(io_exec, arc.read, chunk_size)
chunk = await read_ftr
在第二行抛出AssertionError(“未与future一起使用的收益率”),我如何让它工作
下面是我试图运行的代码片段。将三个read_ftr行融合在一起以获得第一个单行实现,而下面的方式会在“chunk=await read_ftr”处抛出断言错误
read\ftr:aio.Future=None
hash\u ftr:aio.Future=None
区块=无
以开放式(弧形路径,“rb”)作为圆弧:
当弧切小于弧切尺寸时:
块大小=最小值(弧大小-弧大小,最大块大小)
如果读取\u ftr:
chunk=等待读取\u ftr
read_ftr=evt_loop.run_in_executior(io_exec,arc.read,chunk_size)
弧切+=块大小
如果不是块:
持续
如果hash_ftr:
等待散列
hash\u ftr=hasher.async\u更新(块)
如果hash_ftr:
等待散列
等待hasher.async_摘要()
当您像以前那样声明一个变量时,foo\u var=coroutine(args)
实际上是在调用函数,并将其结果应用于变量。要将函数作为变量传递,请将其作为foo\u var=coroutine
执行,然后在以后使用foo\u var(args)
调用它。当您在函数旁边添加括号时,它将尝试调用并运行该函数(即使它是一个coroutine/async函数)当您像foo\u var=coroutine(args)那样声明变量时
您实际上正在调用函数,并将其结果应用于变量。要将函数作为变量传递,请按foo\u var=coroutine
的方式执行,然后在以后使用foo\u var(args)
调用它。每当在函数旁边添加括号时,它将尝试调用并运行该函数(即使它是一个coroutine/async函数)这两个代码段应该是100%等效的。你能构造一个最小的例子来演示你看到的断言吗?将chunk=await run\u in\u executor(…)
分成上面显示的三行不是等效的代码-较长的版本将arc.read
调用推迟到下一个循环迭代,直到调用async\u update
之后。也许这就是问题的原因?根据您的示例,很难判断哪一行虽然最小,但不可运行,因此我们无法复制您的结果。请尝试将print(type(read_ftr))
放在chunk=wait read_ftr
行之前。这将有助于了解发生了什么。这两个片段应该是100%等效的。你能构造一个最小的例子来演示你看到的断言吗?将chunk=await run\u in\u executor(…)
分成上面显示的三行不是等效的代码-较长的版本将arc.read
调用推迟到下一个循环迭代,直到调用async\u update
之后。也许这就是问题的原因?根据您的示例,很难判断哪一行虽然最小,但不可运行,因此我们无法复制您的结果。请尝试将print(type(read_ftr))
放在chunk=wait read_ftr
行之前。这将有助于了解发生了什么。这是不正确的-调用协程函数不会“运行”该函数,它只是创建并返回一个协程对象。要执行协同路由内的代码,必须将此对象传递给事件循环,或由另一个协同路由等待。这是不正确的-调用协同路由函数不会“运行”该函数,它只是创建并返回一个协同路由对象。要执行协同路由中的代码,必须将此对象传递给事件循环,或由另一个协同路由等待。
read_ftr = evt_loop.run_in_executor(io_exec, arc.read, chunk_size)
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()