什么是 GIL ? 答案可参考wikipedia中的说明, 简单地说就是:

每一个interpreter进程,只能同时仅有一个线程来执行, 获得相关的锁, 存取相关的资源.

那么很容易就会发现,如果一个interpreter进程只能有一个线程来执行, 多线程的并发则成为不可能, 即使这几个线程之间不存在资源的竞争.

从理论上讲,我们要尽可能地使程序更加并行, 能够充分利用多核的功能, 那么Python为什么要使用 全局的 GIL 来限制这种并行呢?

这个问题,其实已经得到了很多的讨论, 不止十年, 可以参考下面的文档:

反对 GIL 的声音:

认为 GIL 不能去除的:

其它的一些讨论很容易从Google来搜索得到, 譬如: GIL at google.

那么,简单总结下双方的观点.

认为应该去除 GIL 的:

不顺应计算机的发展潮流(多核时代已经到来, 而 GIL 会很影响多核的使用)

大幅度提升多线程程序的速度

认为不应该去除 GIL 的(如果去掉,会):

写python的扩展(module)时会遇到锁的问题,程序员需要繁琐地加解锁来保证线程安全

会较大幅度地减低单线程程序的速度

后者是 Guido 最为关切的, 也是不去除 GIL 最重要的原因, 一个简单的尝试是在1999年(十年前), 最终的结果是导致单线程的程序速度下降了几乎2倍.

我引用如下:

I actually don't think removing the GIL is a good solution.

But I don't think threads are a good solution, either.

They're too hard to get right, and I say that after spending literally years studying threading in both C++ and Java.

Brian Goetz has taken to saying that no one can get threading right.

引自 Bruce Eckel 对 Guido 的回复. 而 Bruce Eckel 是何许人, 如果你了解 java 或者 C++, 那么应该不会不知道他.

python线程安全吗_线程安全及Python中的GIL相关推荐

  1. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源

    线程生命周期 线程状态 New: 线程创建(new Thread()) Runnable: 线程可运行(thread.start()), 注: 调用start并不一定是运行状态, 可能在等待CPU调度 ...

  2. 易语言mysql线程池数量_线程池最佳线程数量到底要如何配置?

    前言 对应从事后端开发的同学来说,线程是必须要使用了,因为使用它可以提升系统的性能.但是,创建线程和销毁线程都是比较耗时的操作,频繁的创建和销毁线程会浪费很多CPU的资源.此外,如果每个任务都创建一个 ...

  3. 如何保证线程安全有序性_线程安全性-原子性-可见性-有序性

    一.相关定义: 线程安全类:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些进程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安 ...

  4. threadpooltaskexecutor线程池使用_线程池的理解及使用

    1.为什么要使用线程池 线程池由任务队列和工作线程组成,它可以重用线程来避免线程创建的开销,在任务过多时通过排队避免创建过多线程来减少系统资源消耗和竞争,确保任务有序完成: 线程池的好处: 1,因为线 ...

  5. Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

    文章目录 1.线程的定义,进程和线程的关系 2.Linux下的线程 Linux原生线程库(pthread库pthread.h) 线程的优点 线程的私有数据 3.线程控制 ①创建线程(pthread_c ...

  6. java 线程亲缘性_线程的调度、优先级和亲缘性

    每隔20ms左右,Windows要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上 ...

  7. java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?

    在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...

  8. python刷题软件_教你用python写:HDU刷题神器

    声明:本文以学习为目的,请不要影响他人正常判题 HDU刷题神器,早已被前辈们做出来了,不过没有见过用python写的.大一的时候见识了学长写这个,当时还是一脸懵逼,只知道这玩意儿好屌-.时隔一年,决定 ...

  9. python语言运行效率高_如何评价说PYTHON是最快的语言?

    我是视频的作者,首先感谢朋友们的关注,并且诞生了这个论题,让我可以看到大家对我视频中的观点的反馈.对于大家的讨论,在日常时间允许的条件下,我会尽量参与.下面就我目前已经看到的朋友们的评论,做一下展开. ...

  10. python 性能并不慢_关于性能:Python多处理队列比pool.map慢

    我最近开始尝试多处理以加快任务速度.我创建了一个脚本,该脚本执行模糊字符串匹配,并使用不同的算法来计算分数(我想比较不同的匹配技术).您可以在这里找到完整的源代码:https://bitbucket. ...

最新文章

  1. apache+tomcat 搭建负载均衡系统
  2. 用vue优雅地编写UI组件的几条指导原则
  3. An overview of gradient descent optimization algorithms
  4. java的http请求头信息_HTTP请求头所包含的信息
  5. linux cp命令强行覆盖复制
  6. iOS开发——手机号,密码,邮箱,身份证号,中文判断
  7. 阿里云移动测试平台MQC移动测试沙龙第3期【北京站】
  8. php调用image类提示不存在的字体,php – 无效的字体文件名(imagettfbox)
  9. Laravel+passport 实现API认证
  10. SCUT - 244 - 全新的游戏 - 凸包
  11. 海量图片去重算法-局部分块Hash算法
  12. 获取TextView每行的内容 (涉及getLineCount为0,getLineEnd问题)
  13. mqtt客户端工具_如何在 Rust 中使用 MQTT
  14. (转:htk中命令行参数的读取)
  15. Win10屏幕自带的截图,同时保存多个截图
  16. php laypage,ThinkPHP5、内容管理系统、前端框架layui、layPage模块
  17. 单片机---STM8开发环境搭建与标准库工程创建
  18. MPU6050的运动中断应用
  19. 2021年山东省职业院校技能大赛中职组”网络安全“正式赛题
  20. Matlab plot 光滑曲线

热门文章

  1. 一起来玩AZURE SQL(二)AZURE SQL 初级使用篇
  2. MFC开发IM-第二十篇、MFC添加自定义消息
  3. python调用rocketmq的api_rocketmq-python
  4. “我没搞懂元宇宙,但一天能赚9w块”
  5. 联想拯救者Y90关键参数曝光:22GB运存+640GB超大存储
  6. 郭明錤:因设计复杂 苹果可能推迟至明年底生产AR/VR头盔
  7. 万象双环设计+原色双影像极致体验 华为P50标准版9月29日正式开售
  8. 外媒吐槽:iPhone 13系列为史上力度最小的升级
  9. LG能源解决方案去年年底已开始研发磷酸铁锂电池
  10. 不会有1TB?研究机构称iPhone 13最高存储仍为512GB