Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.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协同程序包装到任务中/何时使用任务或协同程序?_Python_Async Await_Task_Python Asyncio - Fatal编程技术网

为什么我需要将python协同程序包装到任务中/何时使用任务或协同程序?

为什么我需要将python协同程序包装到任务中/何时使用任务或协同程序?,python,async-await,task,python-asyncio,Python,Async Await,Task,Python Asyncio,在python中,有:协同程序、任务和未来 我可以等待协同程序,也可以任务 等待合作 导入异步IO 异步定义嵌套(): 返回42 异步def main(): 打印(wait nested())#将打印“42”。 asyncio.run(main()) 等待任务 import asyncio async def nested(): return 42 async def main(): task = asyncio.create_task(nested()) awai

在python中,有:协同程序、任务和未来

我可以
等待
协同程序,也可以
任务

等待合作

导入异步IO
异步定义嵌套():
返回42
异步def main():
打印(wait nested())#将打印“42”。
asyncio.run(main())
等待任务

import asyncio

async def nested():
    return 42

async def main():
    task = asyncio.create_task(nested())
    await task

asyncio.run(main())
首先,在任务中包装协同程序的价值是什么?看起来他们做了同样的事情


什么时候需要使用任务与协同程序?

创建
任务
将传递的协同程序安排在事件循环上运行。您可以使用
任务
来取消底层协同程序。

在这种情况下,没有什么真正的区别:通过等待协同程序,它将被安排为它所属任务的一部分。然而,这意味着它是由其父代驱动的

通过将协同程序包装到任务中,它在事件循环中得到独立的调度,这意味着它不再受包含任务的驱动(它有自己的生命周期),并且可以更丰富地与之交互(例如取消或添加回调)


想想“功能”和“线程”,真的。协同程序只是一个可以挂起的函数(如果它等待东西的话),但它仍然只存在于调用程序的词汇和动态上下文中。一个任务从该上下文中释放出来,它使包装的协程过自己的生活,就像线程使包装的函数(目标)过自己的生活一样。

协程只是在当前可等待的上下文中运行的函数。它可以代表调用者(调用
wait
的人)执行事件循环。考虑一个允许暂停线程的函数。您可以从一个协同程序调用另一个协同程序,但它们仍然共享同一个线程

另一方面,Task会立即将一个单独的作业发布到事件循环中。任务本身就是该工作的句柄。您可以
等待任务,但它可以在“并行”环境中自行运行-在单线程环境中,这意味着任务可以在其他josb屈服时运行(例如,等待I/O)。任务可能会在您调用
wait
之前完成

没有任务的示例:

job_1=睡眠(5)
作业2=睡眠(2)
#我会睡5秒钟
等待工作1
#将再睡2秒钟
等待工作2
任务示例:

job_1=睡眠(5)
job_2=asyncio.create_任务(睡眠(2))
#我会睡5秒钟
等待工作1
#此时,作业2已完成
#因为前一个作业在某个点上已经让步,允许其他作业运行
#因此,等待并不需要时间
等待工作2

你能澄清你的问题吗?还有比列出的三种类型多得多的等待类型。协同程序和任务是不同的类型-与任何其他两种类型一样,当您需要其特定功能时,您可以选择其中一种。感谢您的评论,为了清晰起见,我进行了编辑,如果有帮助,请告诉我。Oooooo。这就是为什么当我将任务添加到列表中时,我没有等待任务,所以会出现错误?当我尝试将corotines添加到列表中时,也会出现错误,但我认为您无法“执行”该操作。没有代码,我无法告诉您,因为我不知道您的意思。您当然不能等待列表,即使它是一个任务列表(或协同路由),您也需要使用类似于
聚集
等待
的东西,以便将内部可等待对象“多路复用”到单个顶级可等待对象中。您可以收集协同路由列表吗?刚刚测试过,您可以收集一个协同路由列表。如果你可以收集一系列的协同程序,为什么还要费心让它们成为任务呢?这与你在其他情况下制作任务的原因是一样的:如果你收集了一系列的协同程序,你只需要将它们打包在一起,它们仍然必须由当前任务驱动。