繁体   English   中英

Python 中的线程(和异步任务)如何调度?

[英]How are threads (and asyncio tasks) scheduled in Python?

我试图了解 Python 中的并发性,并且对如何安排线程以及如何安排任务(在 asyncio 库中)运行/等待感到困惑。

假设一个线程试图获取一个锁并被阻塞。 Python 解释器是否立即将该线程放入“阻塞”队列? 这个被阻塞的线程如何放回正在运行的 state 中? 是否涉及忙等待?

当异步库中的任务(相当于线程)被异步互斥锁阻塞时,这有什么不同?

如果上述两种情况都没有涉及到忙等待,那么 asyncio 的优势是什么?

假设一个线程试图获取一个锁并被阻塞。 Python 解释器是否立即将该线程放入“阻塞”队列?

Python 创建真正的操作系统线程,因此解释器不需要进行排队或调度。

一个可能的例外是解释器使用全局锁来序列化 Python 代码的执行和对 Python 对象的访问。 这个锁不仅在获取线程锁之前被释放,而且在任何(可能的)阻塞操作之前被释放,例如从 IO 句柄读取或休眠。

如果上述两种情况都没有涉及到忙等待,那么 asyncio 的优势是什么?

优点是 asyncio 不需要为它并行执行的每个协程创建一个新的 OS 线程。 操作系统线程很昂贵,而异步任务非常轻量级。 此外, asyncio 使潜在的切换点可见( await关键字),因此竞争条件的可能性较小。

您可以将 asyncio 视为Twisted的继承者,但使用现代 API 并使用可挂起的协程而不是显式的回调链。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM