Python中的asyncio是用户级线程模型,协作调度吗?

问题描述 投票:0回答:1

我已经在 Python 中使用 asyncio 工作了很长时间,但是我想澄清一些关于 asyncio 实际工作原理的想法。我将分解我的想法,以便提供背景信息,如果我的基础有任何错误,您可以纠正我。 我理解Python程序是内核级线程模型,但是带有GIL。因此,Python 程序将在内核进程中运行,每个 Python 都会调用操作系统线程,但由于 GIL,一次只会运行每个线程。我还了解到,在Python程序中获得多个线程的唯一方法是通过“threading”模块。也就是说,在不使用此模块的普通 Python 程序中,我只会有一个运行单线程的进程。 然后 asyncio 库出现了,我的问题是 asyncio 是否是用户级线程模型、协作调度的实现。事件循环管理所有用户线程(协程),并且每个协程都具有协作方法,因为通过等待它们确定何时将控制权返回给调度程序。此外,所有这些用户线程都映射到单个操作系统线程。我是对的?是这样的吗?

python python-asyncio python-multithreading
1个回答
0
投票

Python 的线程模型:

Python 使用内核级线程模型,但由于全局解释器锁 (GIL),每个进程一次只有一个线程可以执行 Python 字节码。

线程模块:

Python 中的线程模块允许您在单个进程中创建多个线程。然而,由于 GIL,在任何给定时间只有一个线程可以执行 Python 字节码。

异步和协作调度:

Python 中的 Asyncio 不是用户级线程模型,而是基于协作多任务的异步编程框架。它采用单线程事件循环来管理协程(任务)并确定每个协程何时将控制权交还给事件循环。 事件循环:

asyncio 中的事件循环充当调度程序,以协作方式运行一个又一个协程。当协程遇到await语句时,它会暂停执行并允许其他协程运行,直到等待的操作完成。

映射到操作系统线程:

虽然 asyncio 同时管理多个协程,但它们都在单个操作系统线程中执行。事件循环处理协程的调度和执行,而不需要传统的操作系统级线程。

总而言之,asyncio 为 Python 中的异步编程提供了一种协作调度模型,其中协程使用 wait 自愿将控制权交给事件循环,从而允许在单线程环境中实现高效并发。

© www.soinside.com 2019 - 2024. All rights reserved.