我试图了解Python中的并发性,并对如何安排线程以及如何安排任务(在asyncio库中)安排运行/等待感到困惑。
假设一个线程试图获取一个锁并被阻止。 Python解释器会立即将该线程放入“阻塞”队列中吗?这个阻塞的线程如何恢复到运行状态?有忙碌的等待中吗?
当异步互斥体上阻塞asyncio库中的任务(相当于线程)时,这有什么不同?
如果在上述两种情况下都没有繁忙的等待,那么asyncio的优点是什么?
答案 0 :(得分:0)
假设一个线程试图获取一个锁并被阻止。 Python解释器会立即将该线程放入“阻塞”队列吗?
Python创建了真正的操作系统线程,因此解释器无需进行排队或调度。
一个可能的例外是解释器使用global lock来序列化Python代码的执行和对Python对象的访问。此锁不仅在获取线程锁之前释放,而且在任何(可能)阻止操作(例如,从IO句柄读取或进入休眠状态)之前释放。
如果在上述两种情况下都没有繁忙的等待,那么asyncio的优势是什么?
优点是asyncio不需要为每个并行执行的协程使用新的OS线程。操作系统线程很昂贵,异步任务非常轻巧。另外,asyncio使潜在的切换点可见(await
关键字),因此竞争条件的可能性较小。
您可以将asyncio视为Twisted的后继者,但使用现代API,并使用可挂起的协程而不是显式的回调链。