参考:https://stackoverflow.com/questions/20939299/does-python-support-multithreading-can-it-speed-up-execution-time

GIL 不会阻止线程。 GIL 所做的只是确保一次只有一个线程在执行 Python 代码; 控制仍然在线程之间切换。

GIL 阻止的是使用多个 CPU 内核或单独的 CPU 来并行运行线程。

这仅适用于 Python 代码。 C 扩展可以并且确实发布了 GIL,以允许 C 代码的多个线程和一个 Python 线程跨多个内核运行。 这扩展到由内核控制的 I/O,例如用于套接字读写的 select() 调用,使 Python 在多线程多核设置中合理有效地处理网络事件。

许多服务器部署所做的是运行多个 Python 进程,让操作系统处理进程之间的调度,以最大限度地利用您的 CPU 核心。 如果适合您的用例,您还可以使用多处理库来处理来自一个代码库和父进程的多个进程的并行处理。

请注意,GIL 仅适用于 CPython 实现; Jython 和 IronPython 使用不同的线程实现(分别是本机 Java VM 和 .NET 公共运行时线程)。

直接解决您的更新:任何试图通过并行执行获得速度提升的任务,使用纯 Python 代码,都不会看到加速,因为线程 Python 代码被锁定为一次执行一个线程。 但是,如果您混合使用 C 扩展和 I/O(例如 PIL 或 numpy 操作),则任何 C 代码都可以与一个活动的 Python 线程并行运行。

Python 线程非常适合创建响应式 GUI,或处理多个短 Web 请求,其中 I/O 比 Python 代码更成为瓶颈。 它不适合并行化计算密集型 Python 代码,坚持使用多处理模块来完成此类任务或委托给专用的外部库。

Python 标准库确实有一个多线程库——而且它可以工作。
参考实现(来自 Welcome to Python.org 的 CPython)实现了一个 GIL,以便它在线程之间可靠地引用跟踪。

GIL 意味着来自同一个 Python 进程的两个线程不能同时执行 Python 代码; GIL 在开始执行单个 Python 字节码时获取,并在字节码执行完成时释放。
GIL 不会阻止 Python 程序中的 C 扩展成为多线程——如果一个正在等待 I/O 完成,它也不会阻止两个 Python 线程一起运行。
Python 的其他实现(著名的 JYthon 和 PyPy)不使用 GIL,并且在这些实现中纯 Python 线程是同时执行的; 线程在不同的 CPU 内核上执行。

最新文章

  1. 使用cookie实现计数器功能
  2. mysql之导入与导出
  3. c# ref关键字对于引用类型传递的影响
  4. Web版的各种聊天工具
  5. ASP.NET JSON的序列化和反序列化 之 Newtonsoft.Json
  6. Mysql bigint 类型转为datetime
  7. 如何确定Ubuntu下是否对某个CVE打了补丁
  8. twitter 监测登陆活动
  9. windows phone (22) 隐藏元素
  10. 【值得收藏】Mathematica数值计算工具的学习资料汇编【可免费下载】
  11. 玩转 SSH 目录
  12. ABP框架 - 规约
  13. 从Java继承类的重名static函数浅谈解析调用与分派
  14. java数据结构和算法01(数组的简单使用)
  15. 解决 golang unrecognized import path "golang.org/x" 之类错误的一种尝试
  16. 第九周博客作业 <西北师范大学| 周安伟>
  17. 前序遍历and中序遍历and后序遍历
  18. 小程序支持打开APP了 还有小程序的标题栏也可以自定义
  19. Redis怎么保持缓存与数据库一致性?
  20. Hadoop专业解决方案-第5章 开发可靠的MapReduce应用

热门文章

  1. 基于C++的OpenGL 13 之Mesh
  2. .Babylon格式的模型转化为glb模型,并使用ThreeJS加载显示
  3. virtualbox装配fedora时,安装增强功能包时会报错解决
  4. 汇总-软件-分类:SSH客户端工具
  5. React Tree树形结构封装工具类
  6. 蓝牙mesh组网实践(mesh组网的评估与沁恒蓝牙芯片选型)
  7. hive知识点总结
  8. Lua文件夹及文件操作
  9. java 枚举使用
  10. 基于北斗gps设计的NTP网络时间服务器