python - 多线程在 GIL 存在的情况下会有什么优势?
问题描述
如果在 GIL 的存在下,一个多线程程序中执行的所有子任务都是顺序发生的,那么它就相当于单线程程序。为什么要用 Python 编写多线程包(multiprocessing.dummy.Pool、multiprocessing.pool.ThreadPool、concurrent.futures.ThreadPoolExecutor 等)?为什么有人要使用它们?(这与多处理无关)
解决方案
两件事情:
GIL 不时发布。例如,当您尝试执行一些冗长的操作(从文件读取、写入文件、通过网络发送等)时。这允许一些交错操作 - 在一个线程中读取,在另一个线程中处理。
多线程不仅是性能,还有其他好处——例如易于表达。想象一下,您有两个“并行”运行的算法,它们相互通信并交换数据。你把每个算法放在它自己的线程上,同步(以确保线程切换会发生)然后你就走了。如果没有多线程,您将不得不依赖事件编程,这既困难又容易扩展。一个很好的例子是各种基于会话的服务器,例如 ftp 服务器。编写多线程多用户 ftp 服务器比单线程容易得多。
一般来说是的,如果你使用线程来提高性能,那么 python 的线程就没有意义了。但是 python 不是用于性能,而是用于编写(和修改)代码的难易程度。线程确实对并行代码有很大帮助,即使它们不提供任何多线程性能优势。
推荐阅读
- excel - 将 Bash 中的 CSV 读入字典/关联数组
- django - Django model_name.item.add(item) 将项目添加到模型中的所有记录
- javascript - 按从一天中的时间开始的顺序从数组中输出图像
- firebase - 允许读取任何用户的最佳 Firebase 规则
- python - Python Tkinter:_tkinter.TclError:图像“pyimage1”不存在
- php - php 选择控件更改布局
- telegram - 使用 Telethon 在所有 Telegram 组中搜索单词
- r - data$Y_i1 中的错误:“闭包”类型的对象不可子设置
- reactjs - 由于 ESLint 错误,我的 create-react-app 无法编译
- laravel - laravel 错误:rand() 期望参数 2 为 int, string