首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 多线程是鸡肋?

多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 "1亿" 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换...这也就是多线程鸡肋的原因,因为它没有细粒度的控制数据的安全,而是用一种简单粗暴的方式来解决。...多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 "1亿" 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换

77340
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python Web学习笔记之GIL机制下的鸡肋多线程

    多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 “1亿” 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换...之父就搞了个全局的线程锁,不管你数据有没有同步问题,反正一刀切,上个全局锁,保证数据安全。...这也就是多线程鸡肋的原因,因为它没有细粒度的控制数据的安全,而是用一种简单粗暴的方式来解决。...这种解决办法放在90年代,其实是没什么问题的,毕竟,那时候的硬件配置还很简陋,单核 CPU 还是主流,多线程的应用场景也不多,大部分时候还是以单线程的方式运行,单线程不要涉及线程的上下文切换,效率反而比多线程更高

    60260

    CAS之比较并交换

    没有CAS之前 多线程环境不使用原子类保证线程安全(基本数据类型) public class T3 { volatile int number = 0; //读取 public...执行cmpxchg指令的时候,会判断当前系统是否为多核系统,如果是就给总线加锁,只有一个线程会对总线加锁成功,加锁成功之后会执行cas操作,也就是说CAS的原子性实际上是CPU实现的, 其实在这一点上还是有排他锁的...变量value用volatile修饰,保证了多线程之间的内存可见性。...jint e, jint x)) UnsafeWrapper("Unsafe_CompareAndSwapInt"); oop p = JNIHandles::resolve(obj); // 先想办法拿到变量...总结 只需要记住:CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性 实现方式是基于硬件平台的汇编指令,在intel的CPU中(X86机器上),使用的是汇编指令cmpxchg

    39220

    为什么有人说 Python 多线程是鸡肋?

    多线程是不是鸡肋,我们先做个实验,实验非常简单,就是将数字 "1亿" 递减,减到 0 程序就终止,这个任务如果我们使用单线程来执行,完成时间会是多少?使用多线程又会是多少?...因此,这也就是为什么两个线程一起执行反而更加慢的原因,因为同一时刻,只有一个线程在运行,其它线程只能等待,即使是多核CPU,也没办法让多个线程「并行」地同时执行代码,只能是交替执行,因为多线程涉及到上线文切换...,所以,Python之父就搞了个全局的线程锁,不管你数据有没有同步问题,反正一刀切,上个全局锁,保证数据安全。...这也就是多线程鸡肋的原因,因为它没有细粒度的控制数据的安全,而是用一种简单粗暴的方式来解决。...这种解决办法放在90年代,其实是没什么问题的,毕竟,那时候的硬件配置还很简陋,单核 CPU 还是主流,多线程的应用场景也不多,大部分时候还是以单线程的方式运行,单线程不要涉及线程的上下文切换,效率反而比多线程更高

    99560

    5分钟了解并发编程中的『锁』

    虽然操作系统在软件层通过时间片划分能模拟出多线程,但本质上还是串行,此时锁的应用场景非常少。当CPU发展成多核之后真正的并发执行开始出现,计算机真正意义上实现同一时间做多件事。...相比顺序执行,并发执行让计算机的计算能力再次飞跃,比如『天河一号』就是利用多核CPU的并行计算能力。并发执行虽然快但首先要解决的问题是资源同步。...常见办法之一就是使用『CAS+自旋』乐观锁,它利用CPU提供的硬件级指令让A线程对V资源的变更变成一个原子操作,原子操作的好处就是要么成功要么失败,不会被中断。...CAS虽然高效,但也存在三大问题(当前这三大问题都有很成熟的解决方案)。 1. ABA问题。 CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。...下面说说悲观如何解决阻塞线程与造成死锁的问题。 使用自旋锁优化CPU上下文切换 - 线程被阻塞或唤醒需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。

    1.8K30

    从根上理解高性能、高并发(六):通俗易懂,高性能服务器到底是如何实现的

    至此:关于利用事件驱动来实现并发编程的所有问题都解决了吗?event的来源问题解决了,当得到event后调用相应的handler,看上去大功告成了。 想一想还有没有其它问题?...8、问题:阻塞式IO 现在:我们可以使用一个线程(进程)就能基于事件驱动进行并行编程,再也没有了多线程中让人恼火的各种锁、同步互斥、死锁等问题了。...首先:我们提到,event loop是运行在一个线程中的,显然一个线程是没有办法充分利用多核资源的,有的同学可能会说那就创建多个event loop实例不就可以了,这样就有多个event loop线程了...,但是这样一来多线程问题又会出现。...那么有没有更好的方法呢? 要找到更好的方法,我们需要解决问题的本质,那么这个本质问题是什么呢? 11、更好的方法 为什么我们要使用异步这种难以理解的方式编程呢?

    1.1K31

    你真的知道Java内存模型是什么吗

    那么,有没有什么机制可以很好的解决上面的这些问题呢? 最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。...本文就不深入底层原理来展开介绍了,感兴趣的朋友可以自行学习。 什么是Java内存模型 前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。...在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,从来就不需要关心底层的编译器优化、缓存一致性等问题。...本文还有一个重点要介绍的就是,我们前面提到,并发编程要解决原子性、有序性和一致性的问题,我们就再来看下,在Java中,分别使用什么方式来保证。...有序性 在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性。实现方式有所区别: volatile关键字会禁止指令重排。

    67230

    你用对锁了吗?浅谈 Java “锁” 事

    至此已经分析完了并发 BUG 的源头,即这三大问题。可以看到不管是 CPU 缓存、多核 CPU 、高级语言还是乱序重排其实都是必要的存在,所以我们只能直面这些问题。...所以最简单的解决办法就是把raiseSalary() 和 compareSalary() 都用 synchronized 修饰,这样涨工资和比工资两个线程就不会在同一时刻执行,因此肯定就安全了!...看起来锁好像也挺简单,不过这个 synchronized 的使用还是对于新手来说还是有坑的,就是你要关注 synchronized 锁的究竟是什么。 比如我改成多线程来涨工资。...那我再修改下代码,让每个线程自己有一个 yesLockDemo 实例来涨工资。 你会发现这锁怎么没用了?这说好的百万年薪我就变 10w 了??这你还好还有 70w。...所以来降个级让大家都能读。 小结一下,读写锁适用于读多写少的情况,无法升级,但是可以降级。Lock 的锁需要配合 try- finally,来保证一定会解锁。

    51640

    轻松理解计算机的内存模型及Java内存模型

    那么,有没有什么机制可以很好的解决上面的这些问题呢? 最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。...本文就不深入底层原理来展开介绍了,感兴趣的朋友可以自行学习。 什么是Java内存模型 前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。...在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,从来就不需要关心底层的编译器优化、缓存一致性等问题。...本文还有一个重点要介绍的就是,我们前面提到,并发编程要解决原子性、有序性和一致性的问题,我们就再来看下,在Java中,分别使用什么方式来保证。...有序性 在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性。实现方式有所区别: volatile关键字会禁止指令重排。

    1.5K20

    Python的全局解释器锁(GIL)GIL是什么为什么会有GILGIL的影响顺序执行的单线程(single_thread.py)同时执行的两个并发线程(multi_thread.py)当前GIL设计的

    所以目前的现状就是,Python的多线程在多核CPU上,只对于IO密集型计算产生正面效果;而当有至少有一个CPU密集型线程存在,那么多线程效率会由于GIL而大幅下降。...为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。...即使在CPU内部的Cache也不例外,为了有效解决多份缓存之间的数据同步时各厂商花费了不少心思,也不可避免的带来了一定的性能损失。 Python当然也逃不开,为了利用多核,Python开始支持多线程。...而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。...如何避免受到GIL的影响 说了那么多,如果不说解决方案就仅仅是个科普帖,然并卵。GIL这么烂,有没有办法绕过呢?我们来看看有哪些现成的方案。

    1.4K100

    Java内存模型是什么,为什么要有Java内存模型,Java内存模型解决了什么问题等。。。

    那么,有没有什么机制可以很好的解决上面的这些问题呢? 最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。...本文就不深入底层原理来展开介绍了,感兴趣的朋友可以自行学习。 什么是Java内存模型 前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。...在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,从来就不需要关心底层的编译器优化、缓存一致性等问题。...本文还有一个重点要介绍的就是,我们前面提到,并发编程要解决原子性、有序性和一致性的问题,我们就再来看下,在Java中,分别使用什么方式来保证。...有序性 在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性。实现方式有所区别: volatile关键字会禁止指令重排。

    27820

    Java内存模型详解

    那么,有没有什么机制可以很好的解决上面的这些问题呢? 最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。...本文就不深入底层原理来展开介绍了,感兴趣的朋友可以自行学习。 什么是Java内存模型 前面介绍过了计算机内存模型,这是解决多线程场景下并发问题的一个重要规范。...在开发多线程的代码的时候,我们可以直接使用synchronized等关键字来控制并发,从来就不需要关心底层的编译器优化、缓存一致性等问题。...本文还有一个重点要介绍的就是,我们前面提到,并发编程要解决原子性、有序性和一致性的问题,我们就再来看下,在Java中,分别使用什么方式来保证。...有序性 在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性。实现方式有所区别: volatile关键字会禁止指令重排。

    30620

    铁路与多核多线程

    从接触第一个多线程项目以来,已经是第三个年头了,一直想把这几年的点点滴滴写成文章,让刚接触的人少走弯路,这便是我写这篇系列文章的初衷。     如何理解多核多线程这些概念呢?    ...当不同列车需要同时使用同一路段时,就会造成道路的竞争,交通一旦拥塞,效率开始变的低下和事故频发。为了解决这个问题,信号灯开始出现在关键岔口上,只有当列车收到允许通过的信息后,才能继续前行。...如果从多线程的角度来看待道路竞争引发的问题,可以认为是线程的同步问题。在多线程程序中,可以利用各种锁或者信号量等同步手段来解决资源冲突的矛盾,只有解决了资源冲突问题,才能保证程序的正确性。    ...从操作系统的角度来观察临客的解决方案,这个过程相当于多线程中的线程调度,让不同的线程拥有不同的优先级和调度策略,来提高程序的整体效率。     解决了临客的调度问题,真的可以解决买票难的问题吗?...这种方法就相当于我们今天谈论的多核技术,让不同功能的进程在不同的核上运行,或者让同一进程的不同功能的线程运行在不同的核上。     将多核多线程与实际生活中的例子进行类比,多核多线程显得并不神秘。

    77110

    驱动智慧医疗,从至强开始 ——英特尔,用人工智能解决大问题

    英特尔助力乳癌筛查,用人工智能解决大问题 大数据、云计算、人脸识别、自动驾驶……近年来这些耳熟能详的人工智能科技,正在悄然改变着我们的生活。...英特尔作为全球领先的科技公司,一直致力于用人工智能解决大问题。...面对乳腺癌这一威胁女性健康的“头号杀手”,英特尔与国家级医学影像人工智能高新技术企业——汇医慧影公司携手,将用于乳腺癌筛查的深度学习模型,应用在英特尔至强可扩展处理器平台上,大幅提升数据的处理和推理效率,让乳腺癌的筛查更精准...针对来自多个医疗中心的海量影像数据,至强服务器提供最高达768GB的超大内存,配合多核心多线程处理能力,对乳腺采集影像进行像素级别的特征识别。 3....未来,英特尔的人工智能还将在智慧医疗领域发挥更大的作用,致力解决人类面临的大问题,加速行业转型,更好地帮助医生,造福广大患者。

    47730

    Redis线程模型的前世今生

    如何充分利用CPU的多核特性呢?自然而然的想到了——多线程逻辑。 2.1.2 多线程阻塞 对工程师而言,代码解释一切,直接上代码。...CPU的空转、系统调用(每次轮询到涉及到一次系统调用,通过内核命令来确认数据是否准备好),造成资源的浪费,那有没有一种机制,来解决这个问题呢?...优点 让主线程专注于通用事件的处理(连接、读、写),从设计上进一步解耦; 利用CPU多核的优势。...有没有什么好的办法来解决上述问题呢?通过以上的分析,大家有没有发现一个现象,当某一个点成为系统瓶颈点时,想办法把他拿出来,交个其他线程来处理,那这种场景是否适用呢?...优点 让主线程专注于连接事件的处理,子线程专注于读写事件吹,从设计上进一步解耦; 利用CPU多核的优势。 缺点 实现上会比较复杂,在极度追求单机性能的场景中可以考虑使用。

    35331

    都是事件驱动,为什么Nginx的性能远高于Redis?

    如何充分使用多核CPU? 由于散热问题,CPU频率已经十多年没有增长了。...CPU厂商对这一问题的解决方案是横向往多核心发展,因此上图中表示核心数的黑色线至2005年后快速上升。由于操作系统使用CPU核心的最小单位是线程,要想同时使用CPU的所有核心,软件必须支持多线程才行。...想做到这一点,只有完全使用非阻塞的系统调用。对于网络消息的传输,non-block socket可以完美实现。然而,Linux上磁盘文件的读取却是个大问题。...到这里你可能有个疑问:又是多进程,又是多线程,为什么Nginx不索性简单点,全部使用多线程呢?这主要由2个原因决定: 首先,作为高性能负载均衡,稳定性非常重要。...因此,Nginx宁肯选用多进程模式使用多核CPU,而只以多线程作为补充。 Worker进程间是如何协同处理请求的?

    2.5K21

    Python 在企业级应用中的两大硬伤

    因为Python的并行是伪并行,对于CPU来说就是串行,甚至比串行还慢,难以充分利用现代CPU多核的优势。...Python无法在进程内使用简单的多线程并行机制,很多程序员只能采用复杂的多进程并行,进程本身的开销和管理复杂得多,并行程度无法和多线程相提并论,加上进程间的通信也很复杂,有时只好不直接通信,用文件系统来传递汇总结果...这种问题虽然不像Python2升级到Python3时那么严重,但版本更新多了,问题累计也就多了,也就成大问题了。...解决这个问题,似乎只要企业形成共识,找到一个“稳定版”即可,事实上很多工具软件都有类似的问题且可以采用这样的办法,但对于Python来讲却并没有那么容易。...SPL提供不依赖数据库的计算能力,数据库更换不需要更改 SPL 计算脚本,解决存储过程的移植性问题;简洁易用的 IDE 环境编辑调试功能齐全,算法实现更加简单;SPL 体系更加开放,可以直接使用多样数据源计算

    8310
    领券