精华内容
下载资源
问答
  • Python中的多线程是假的多线程! 因为Cpython解释器有一个东西叫全局解释器锁(GIL)。在解释器解释执行 Python 代码时,先要得到这把锁,意味着,任何时候只可能有一个线程在执行代码,其它线程要想获得 CPU 执行...

    情景描述

    最近在做实验时,想到用多线程来加快对数据集的加载速度。在尝试后总感觉时间依旧很慢,于是查阅资料得知:python多线程是个天坑

    Python中的多线程是假的多线程! 因为Cpython解释器有一个东西叫全局解释器锁(GIL)。在解释器解释执行 Python 代码时,先要得到这把锁,意味着,任何时候只可能有一个线程在执行代码,其它线程要想获得 CPU 执行代码指令,就必须先获得这把锁,如果锁被其它线程占用了,那么该线程就只能等待,直到占有该锁的线程释放锁才有执行代码指令的可能。所以python多线程实际上等价于单线程,而且还在切换线程上浪费很多时间!

    测试

    运行下面的函数testadd()10次,分别使用单线程、多线程、多进程

    import time
    from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
    
    
    def testadd():
        s = 0
        for i in range(int(1e7)):
            s += i
            s /= 2
        return s
    
    
    if __name__ == '__main__':
        time1 = time.perf_counter()
    
        for i in range(10):
            testadd()
        time2 = time.perf_counter()
        print(f'{time2 - time1:.2f}')
    
        pool = ThreadPoolExecutor(max_workers=8)
        tasks = [pool.submit(testadd) for i in range(10)]
        for t in tasks:
            t.result()
        time3 = time.perf_counter()
        print(f'{time3 - time2:.2f}')
    
        pool = ProcessPoolExecutor(max_workers=8)
        tasks = [pool.submit(testadd) for i in range(10)]
        for t in tasks:
            t.result()
        time4 = time.perf_counter()
        print(f'{time4 - time3:.2f}')
    

    运行结果:

    6.33
    17.38
    1.06
    

    可以看出,当单线程耗时6秒时,多线程耗时17秒!几乎3倍的时间!而多进程时间仅为1秒!

    展开全文
  • Python中的多线程是假的多线程?

    万次阅读 2018-06-30 16:22:52
    Python中的多线程是假的多线程?为什么这么说,我们先明确一个概念,全局解释器锁(GIL)global interpreter lockPython代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程在执行对Python虚拟机的访问由全局...

    Python中的多线程是假的多线程?

    为什么这么说,我们先明确一个概念,全局解释器锁(GIL)global interpreter lock

    Python代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程在执行

    对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。

    在多线程环境中,Python虚拟机按照以下方式执行。 1.设置GIL。 2.切换到一个线程去执行。 3.运行。 4.把线程设置为睡眠状态。 5.解锁GIL。 6.再次重复以上步骤。

    比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。执行一段时间后让出,多线程在Python中只能交替执,100核只能用到1个核例如,下面的代码4核cpu只会用一个核,大概占用25%的cpu使用率。

    from threading import Thread
    
    def loop():
    
        while True:
    
            print("亲爱的,我错了,我能吃饭了吗?")
    
    if __name__ == '__main__':
    
        for i in range(3):
            t = Thread(target=loop)
            t.start()

    而如果我们变成进程呢?cpu --100%

    
    from multiprocessing import Process
    
    def loop():
        while True:
            print("亲爱的,我错了,我能吃饭了吗?")
    
    if __name__ == '__main__':
        for i in range(3):
            t = Process(target=loop)
            t.start()
    

    多线程怎么使用多核: 1、重写python编译器(官方cpython)如使用:PyPy解释器 2、调用C语言的链接库

    展开全文
  • python中的多线程是假的多线程?

    千次阅读 2019-04-28 21:00:57
    python中的多线程是假的多线程?为什么这么说,我们先明确一个概念,全局解释器锁(GIL)global interpreter lockPython代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程在执行对Python虚拟机的访问由全局...

    python中的多线程是假的多线程?

    为什么这么说,我们先明确一个概念,全局解释器锁(GIL)global interpreter lock

    Python代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程在执行

    对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。

    在多线程环境中,Python虚拟机按照以下方式执行。 1.设置GIL。 2.切换到一个线程去执行。 3.运行。 4.把线程设置为睡眠状态。 5.解锁GIL。 6.再次重复以上步骤。

    比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。执行一段时间后让出,多线程在Python中只能交替执,100核只能用到1个核例如,下面的代码4核cpu只会用一个核,大概占用25%的cpu使用率。

    展开全文
  • 进程,是系统进行资源分配...(python多线程是假的,因为cpython解释器中的一个模块GIL(全局解释器锁),GIl功能和互斥锁相似。) 证明过程: (一)多进程 import multiprocessing import os imp...
    进程,是系统进行资源分配最小单位(拥有独立的内存单元)。(python中多进程是真的)
    线程,是操作系统最小的执行单位(共享内存资源),比进程还小。(python中多线程是假的,因为cpython解释器中的一个模块GIL(全局解释器锁),GIl功能和互斥锁相似。)
     
     

    证明过程:
    (一)多进程
    import multiprocessing
    import os
    import time
    
    def add2():
        start_time = time.time()
        for i in range(100000000):
            pass
        end_time = time.time()
        use_time = end_time - start_time
        print("进程id: %s use_time: %s" % (os.getpid(), use_time))
    
    if __name__ == '__main__':
        print("【进程测试】")
        p1 = multiprocessing.Process(target=add2, args=(), name="p1-进程")
        print("p1.name :%s" % p1.name)
        p2 = multiprocessing.Process(target=add2, args=(), name="p2-进程")
        start_time = time.time()
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        end_time = time.time()
        use_time = end_time - start_time
        print("主进程id:%s use_time: %s" % (os.getpid(),use_time))
    
        print("====主进程单独运行一次循环耗时:=====")
        add2()
    

      

    多进程运行结果:
      
     
     
    (二)多线程
    import threading
    import time
    
    def add2():
        start_time = time.time()
        for i in range(100000000):
            pass
        end_time = time.time()
        use_time = end_time - start_time
        print("线程id:%s 耗时:%s" % (threading.current_thread().ident, use_time))
    
    if __name__ == '__main__':
        print("【线程测试】")
        print("主线程:%s 主线程id:%s" % (threading.current_thread(), threading.current_thread().ident))
        t1 = threading.Thread(target=add2, args=(), name="t1-线程")
        t2 = threading.Thread(target=add2, args=(), name="t2-线程")
        start_time = time.time()
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        end_time = time.time()
        use_time = end_time - start_time
        print("线程id:%s 耗时:%s  (主线程)" % (threading.current_thread().ident, use_time))
    
        print("====主线程单独运行一次循环耗时:=====")
        add2()
    

      

    多进程运行结果:
     
     
    (三)结论:
     
    不论是线程还是进程,循环单独运行的时间都是差不多的4秒内。
    而多线程的总耗时基本上是单独循环一次耗时的2倍左右,所以多线程是假的,是串行的。

    转载于:https://www.cnblogs.com/andy9468/p/9615090.html

    展开全文
  • Python多线程编程

    2018-04-16 16:59:00
    经常说的一个话题:Python多线程是假的多线程。具体python为什么在多线程方面比较弱呢? 以下资料来自于网络的整理。 全局解释器锁(GIL) Python代码的执行由Python虚拟机(解释器)来控制。 Python在设计之初就...
  • 很多人都说python多线程是假的多线程!下面进行论证解释: 一、  我们先明确一个概念,全局解释器锁(GIL) Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个...
  • Python多线程总结

    2018-05-04 11:35:56
    1、Python多线程是假的多线程。2、全局解释器锁(GIL)Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中...
  • https://www.zhihu.com/question/23474039/answer/269526476
  • 深入理解Python 多线程

    2020-12-17 03:33:42
    Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。 那么什么时候用多...
  • 1、 问: 答: 2、 from threading import Thread ​ def loop(): ​ while True: ​ print("亲爱的,我错了,... 参考文章2:Python中的多线程是假的多线程? 参考文章3:GIL Python的GIL是什么鬼,多线程性能究竟如何
  • python多线程

    2018-07-03 11:53:38
    在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL) 什么是GIL Python代码的执行由Python虚拟机(解释器)来控制,同时只有一个...
  • 今天开始打算开一个新系列,就是python的多线程和多进程实现,这部分可能有些新手还是比较模糊的,都知道python中的多线程是假的,但是又不知道怎么回事,首先我们看一个例子来看看python多线程的实现。import ...
  • 在介绍Python中的线程之前,先明确一个问题,Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL) 什么是GIL Python代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程...
  • python多线程压缩包

    2019-11-23 21:28:58
    程序运行起来,叫进程,进程资源分配的单位,线程执行代码,一个线程只能执行一个任务,想要执行多个任务,就需要多线程 协程依赖于线程,线程依赖于进程,协程切换需要资源相当少,所以效率就会很高 重构:把...
  • python 多线程与多进程

    2019-10-06 13:54:37
    并行运行这些相互独立的多任务,因此提出了多线程编程的概念,主线程应该是个线程的管理者,应该知道子线程的工作,以便于管理 正是由于全局锁的关系,使得线程只能够一个个的取访问,也就是python是假的多线程,...
  • Python多线程与多进程

    2016-03-15 15:23:52
    python里多线程和多进程的用法基本相同,但实现方式是不同的,多线程是伪多线程,多进程就是实实在在的多进程,在任务管理器中可以看到有多个python的多个进程在运行。 python的伪多线程可以提高IO,而比如一个...
  • 网上关于python多线程死与线程传递消息几年前的,这里由于wxpython和threading模块已经更新最新,因此给出最新修改代码,能在2017年最新版的python和模块中运行。 原来的publisher()和callafter都无法使用。 ...
  • Python 多线程与进程 众 所 周 知 Py t h on 中 的 多 线 程 一 个 的 多 线 程 对 于 多 核 CPU 由 于 受 限 于 GI L 全 局 解 释 锁 同 一 时 刻 只 能 有 一 个 线 程 在 运 行 但 对 于 经 常 爬 虫 网...
  • Python多线程通信问题

    2020-01-18 09:20:58
    新人第一次提问, 最近在学习Python多线程, notify()与wait()语句。这我写的一个作业, 要求: 现在的你,一个农场主。农场中养着10头小牛,牛吃草长大,但只有当下雨的时候草才会长大,每天有20%的概率下雨,草...
  • python中的多线程

    2019-02-23 14:18:42
    Python中的多线程是假的多线程! 为什么这么说,我们先明确一个概念,全局解释器锁(GIL)global interpreter lock Python代码的执行由Python虚拟机(解释器)来控制,同时只有一个线程在执行 对Python虚拟机的访问由...
  • Python3 多线程、多进程的使用场景

    千次阅读 2019-01-30 13:17:36
    python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源。。 python多线程适合io操作密集型的任务(如socket server 网络并发这一类的); python...
  • python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源。。 python多线程适合io操作密集型的任务(如socket server 网络并发这一类的);python多线程不...
  • daemon:一个布尔值,指示此线程是否为守护线程(真)()。必须在start()调用之前设置此参数,否则RuntimeError引发该参数。它的初始值从创建线程继承的;主线程不是守护程序线程,因此在主线程中创建的所有...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 166
精华内容 66
关键字:

python多线程是假的

python 订阅