首页 > 解决方案 > 多线程在 GIL 存在的情况下会有什么优势?

问题描述

如果在 GIL 的存在下,一个多线程程序中执行的所有子任务都是顺序发生的,那么它就相当于单线程程序。为什么要用 Python 编写多线程包(multiprocessing.dummy.Pool、multiprocessing.pool.ThreadPool、concurrent.futures.ThreadPoolExecutor 等)?为什么有人要使用它们?(这与多处理无关)

标签: pythonpython-3.xmultithreading

解决方案


两件事情:

  1. GIL 不时发布。例如,当您尝试执行一些冗长的操作(从文件读取、写入文件、通过网络发送等)时。这允许一些交错操作 - 在一个线程中读取,在另一个线程中处理。

  2. 多线程不仅是性能,还有其他好处——例如易于表达。想象一下,您有两个“并行”运行的算法,它们相互通信并交换数据。你把每个算法放在它自己的线程上,同步(以确保线程切换会发生)然后你就走了。如果没有多线程,您将不得不依赖事件编程,这既困难又容易扩展。一个很好的例子是各种基于会话的服务器,例如 ftp 服务器。编写多线程多用户 ftp 服务器比单线程容易得多。

一般来说是的,如果你使用线程来提高性能,那么 python 的线程就没有意义了。但是 python 不是用于性能,而是用于编写(和修改)代码的难易程度。线程确实对并行代码有很大帮助,即使它们不提供任何多线程性能优势。


推荐阅读