- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在下面的代码中:
import asyncio
async def task_func():
print('in task_func')
return 'the result'
async def main(loop):
print('creating task')
task = loop.create_task(task_func())
print('waiting for {!r}'.format(task))
await asyncio.sleep(2)
return_value = await task
print('task completed {!r}'.format(task))
print('return value: {!r}'.format(return_value))
event_loop = asyncio.new_event_loop()
try:
event_loop.run_until_complete(main(event_loop))
finally:
event_loop.close()
当我执行代码时,结果如下:
creating task
waiting for `<Task pending coro=<task_func() running at <ipython-input-29-797f29858344>:1>>`
in task_func
task completed `<Task finished coro=<task_func() done, defined at <ipython-input-29-797f29858344>:1> result='the result'>`
return value: 'the result'
但是我不明白你在loop.create_task(task_func())
设置的代码是什么时候被执行。具体来说,我假设当你向事件循环添加一个任务时,它很快就会执行,所以我想 in task_func
在 waiting for <Task...
之前打印.
然后我发现它总是在waiting for <Task...
之后执行,所以我添加了 await asyncio.sleep(2)
, 但只发现 in task_func
在 2 秒结束前打印。
我还添加了 task_func_2()
这实际上与 task_func()
相同并在 task = loop.create_task(task_func())
下面创建任务但不要添加 return_value_2 = await task2
, 所以 await
不执行任务(否则 task_func_2()
永远不会执行)。
所以现在我很困惑。 loop.create_task()
中的任务加入事件循环后什么时候执行?
最佳答案
Specifically, I assumed when you add a task to the event loop, it is executed soon, so I thought
in task_func
is printed beforewaiting for <Task....
“很快执行”并不意味着立即执行。相反,您可以将其视为“我们一有机会就执行”,我们就是事件循环。自 print
紧随调用 create_task
,此时事件循环还没有机会运行。要让事件循环有机会运行,您必须返回到事件循环,方法是从当前协程返回,或者等待阻塞的东西。
当你await
阻塞协程,例如 asyncio.sleep()
,协程将暂时挂起并放弃对事件循环的控制。事件循环将查看在 sleep 结束之前还有什么要做的,并将找到使用 create_task
安排的任务。在它的运行队列中。这就是为什么 task_func
和 task_func_2
在 main
时执行协程等待 sleep ——但不会在那之前,不管你是否await
特别是它们或其他东西会阻塞。
await
调用协程,例如 task_func
意味着当场请求它的结果,并准备好在协程挂起时等待它。 (等待自动挂起的东西将执行推迟到事件循环,允许其他协程取得进展。)虽然实现不同,但 await
在概念上类似于 join
正在处理一个线程。
关于python - `create_task()`处的任务是什么时候asyncio执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50156371/
我有一段简单的代码让我发疯了一段时间。我已经发布了this几天前询问 create_task 的问题不适用于 input。现在我想出了与此相关的事情。我在一个单独的线程中运行事件循环并在其中推送任务。
在下面的代码中: import asyncio async def task_func(): print('in task_func') return 'the result' asy
asyncio.create_task() 是什么意思做?我查看了文档,似乎无法理解。让我困惑的一段代码是这样的: import asyncio async def counter_loop(x, n
我在理解 asyncio 的 create_task 函数时遇到了一些麻烦。从文档中可以看出,任务在等待时应该同时运行。我将 async func 包装在 deocrator 中,因此我不必为每个 a
我正在尝试创建服务器,但我很难理解如何使用 create_task 启动协程。在第一个测试中,create_task 似乎立即启动任务。但是在第二个测试中,它似乎直到等待它才开始。 import as
我无法理解 asyncio.create_task() 是如何工作的Python 3.7 中引入的函数应该可以工作。如果我这样做: import asyncio async def helloworl
据我所知,当我调用 create_task() 时,它将放在事件循环队列的末尾。 我的用例如下,我有一些任务由同一个协程组成。我想在某些失败情况下取消所有任务。这是模式: async def coro
我有以下代码 import asyncio loop = asyncio.get_event_loop() async def while_loop(): n = 0 while Tr
我编写了一个测试程序来尝试使用 create_task(),它需要等到创建的任务完成。 我尝试使用 loop.run_until_complete() 来等待任务完成,但它会导致带有回溯的错误。 /U
我目前有一个未在整个应用程序中设置的全局变量。我有两个文件,其中 file2 从 file1 导入。全局在 file1 中初始化。 这里是初始化全局变量并稍后在 file1 中使用它的代码。 impo
我需要从异步函数之外的 asyncio.create_task(function()) 返回一个值。 import asyncio async def hello(): return("hel
想象一下,我们正在编写一个应用程序,它允许用户连续运行一个应用程序(假设它是针对 API 的一系列重要操作),并且可以同时运行多个应用程序。要求包括: 用户可以控制并发应用程序的数量(这可能会限制针对
我试图理解 python 的 asynico 模块,并在 https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task
我正在尝试 asyncio.create_task() 但我正在处理这个错误: 这是一个例子: import asyncio import time async def async_say(delay
代码示例: async def download_page(session, url): print(True) async def downloader_init(session):
我正在为 Discord 创建一个机器人,我刚刚编写了这个简单的代码: import discord TOKEN = "token" client = discord.Client() @client
我是 VisualStudio 和 Visual C++ 的新手。我正在尝试在 MFC 项目中使用 Concurrency::create_task 函数。 我创建了 clr 项目,创建了简单的表单并
我希望我的代码使用 python logging 来记录异常。在我通常使用 await 的代码中,通常会引发异常,因此: 尝试: 等待 code_that_can_raise() 除了异常为 e: l
我在远程数据库上创建 addm 任务时遇到问题。 BEGIN DBMS_UTILITY.EXEC_DDL_STATEMENT@dblink( ' begin DBMS_ADVI
我已经看过几个关于 asyncio 的基本 Python 3.5 教程,它们以不同的方式执行相同的操作。在这段代码中: import asyncio async def doit(i): p
我是一名优秀的程序员,十分优秀!