Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 等待不&x27;无法使用分配给变量的协同程序?_Python_Python 3.x_Python Asyncio - Fatal编程技术网

Python 等待不&x27;无法使用分配给变量的协同程序?

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

为什么在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”处抛出断言错误

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()