当 GIL 存在时,为什么要在 python 中编写异步代码?

dsa*_*389 4 python gil python-asyncio

我想知道,如果 python GIL 只允许一次运行一个线程/进程,为什么我应该使用 asyncio,我知道线程之间的切换很昂贵,但是就是这样?这是Python中asyncio的唯一优点吗?

小智 7

由于GIL(全局解释器锁)的存在,Python 中的线程效率很低,这意味着多个线程无法像您在多处理器系统上所期望的那样并行运行。另外,您必须依赖解释器在线程之间切换,这会增加效率低下。

asyc/asyncio 允许单个线程内的并发。作为开发人员,这为您提供了对任务切换更细粒度的控制,并且可以为并发 I/O 绑定任务提供比 Python 线程更好的性能。

您没有提到的第三种方法是multiprocessing。这种方法使用进程进行并发,并允许程序充分利用具有多核的硬件。

  • 我认为需要强调的一个关键点是“asyncio”专门用于在执行并发 I/O 时提供帮助。它允许您让一个线程一次发送许多(100 或 1000)I/O 请求,而不会阻塞该线程。通常,每个 I/O 请求需要一个线程,这在内存使用和上下文切换方面代价高昂(尽管它不保存 GIL - Python 在阻塞 I/O 期间释放 GIL)。如果您正在执行需要保留 GIL 的 CPU 密集型工作,那么“asyncio”根本没有任何好处,而“multiprocessing”是提高性能的最佳选择。 (2认同)