基本异步不执行第二个任务

Basic asyncio not executing second task

在这个最小的示例中,我希望程序在安排任务时打印 foofuu

import asyncio


async def coroutine():
        
    while True:
        print("foo")

async def main():

    asyncio.create_task(coroutine())
    #asyncio.run_coroutine_threadsafe(coroutine(),asyncio.get_running_loop())
    
    while True:
        print("fuu")

asyncio.run(main())

程序只会写fuu.
我的目标是简单地让两个任务同时执行,但创建的任务似乎从未被安排。

我也尝试使用 run_coroutine_threadsafe 但没有成功。

如果我将 await asyncio.sleep(1) 添加到 main.创建的任务执行,程序只会写 foo.

我应该如何使用 asyncio 同时执行 运行 两个任务?

我喜欢这个问题,这个问题的解释说明了 asyncio 和 python 是如何工作的。

Spoilers - It works similar to Javascript single threaded runtime.

那么,让我们看看您的代码。 您只有一个主线程 运行ning,它将连续 运行ning,因为 python 调度程序不必在线程之间切换。 现在,问题是,创建任务的主线程实际上创建了一个协程(绿色线程,由 python 调度程序而不是 OS 调度程序管理),它需要主线程才能执行。

现在主线程永远不会空闲,因为你已经把 while 设置为 True,它永远不会空闲来执行任何其他事情,你的任务也永远不会执行,因为 python调度程序从不进行切换,因为它正忙于执行 while True 代码。

当你进入休眠状态时,它会检测到当前任务正在休眠,它会进行上下文切换,然后你的协程就会启动。

我的建议。如果您的任务 I/O 繁重,请使用 tasks/coroutines,如果您的任务 CPU 繁重(while True),请创建 Python 线程或进程然后 OS 调度程序将处理 运行ning 你的任务,他们将 CPU 切片到 运行 while True.