如果在存在GIL的情况下,多线程程序中执行的所有子任务都是顺序发生的,那么它相当于单线程程序。为什么要用 Python 编写多线程包(multiprocessing.dummy.Pool、multiprocessing.pool.ThreadPool、concurrent.futures.ThreadPoolExecutor 等)?为什么有人应该使用它们? (这与多处理无关)
最佳答案
有两件事:
GIL 会不时发布。例如,当您尝试执行一些冗长的操作(从文件读取、写入文件、通过网络发送等)时。这允许一些交错操作 - 在一个线程中读取,在另一个线程中处理。
多线程不仅仅是性能,还有其他好处 - 例如表达的简便性。想象一下,您有两个“并行”运行的算法,它们相互通信并交换数据。您将每个算法放在它自己的线程上,进行同步(以确保线程切换在可能的情况下发生),然后就可以开始了。如果没有多线程,您就必须依赖事件编程,这很困难但很容易扩展。一个很好的例子是各种基于 session 的服务器,例如 ftp 服务器。编写多线程多用户 ftp 服务器比单线程容易得多。
一般来说,是的,如果你使用线程来提高性能,那么 python 的线程就没有意义。但Python并不是为了性能,而是为了编写(和修改)代码的容易程度。线程确实对并行代码有很大帮助,即使它们不提供任何多线程性能优势。
关于python - GIL 的存在会给多线程带来什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650776/