如何在Python中安排线程(和异步任务)?

时间:2019-09-20 05:59:15

标签: python multithreading mutex python-asyncio python-multithreading

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

假设一个线程试图获取一个锁并被阻止。 Python解释器会立即将该线程放入“阻塞”队列中吗?这个阻塞的线程如何恢复到运行状态?有忙碌的等待中吗?

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

如果在上述两种情况下都没有繁忙的等待,那么asyncio的优点是什么?

1 个答案:

答案 0 :(得分:0)

  

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

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

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

  

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

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

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