zoukankan      html  css  js  c++  java
  • GIL(全局解释器锁)

    1、互斥锁:局部并行改串行,牺牲效率保证数据安全

    2、不同的数据需用不同的锁

    一个进程中多线程,只能由单核处理,多核优势处理需开多进程。

    垃圾回收线程不是随时都在

    因GIL锁的原因,一个进程内多个线程同时只能有一个线程执行代码,也就失去了多核优势。

    3、python多线程应该怎么用?

    对计算来说,cpu越多越好,但是I/O操作来说,CPU再多也无用。

    计算密集型应该用多进程,I /O密集型多线程。

    计算密集型多进程与多线程对比:

    多进程,耗时11.876922607421875秒:

    from multiprocessing import Process
    import os,time
    def work():
        res=0
        for i in range(100000000):
            res*=i
    if __name__=='__main__':
        l=[]
        print(os.cpu_count())#看机器是多少核心
        start=time.time()
        for i in range(4):
            p=Process(target=work)
            l.append(p)
            p.start()
        for i in l:
            i.join()
        stop=time.time()
        print('run time is %s' % (stop-start))

    多线程计算,耗时29.74070429801941秒:

    from threading import Thread
    import os,time
    def work():
        res=0
        for i in range(100000000):
            res*=i
    if __name__=='__main__':
        l=[]
        print(os.cpu_count())
        start=time.time()
        for i in range(4):
            p=Thread(target=work)
            l.append(p)
            p.start()
        for i in l:
            i.join()
        stop=time.time()
        print('run time is %s' % (stop-start))

    I/O密集型多进程与多线程对比:

    多进程,耗时3.7秒

    from multiprocessing import Process
    import os
    import time
    def work():
        time.sleep(2)
    if __name__ == "__main__":
        l=[]
        start=time.time()
        for i in range(400):
            p=Process(target=work)
            l.append(p)
            p.start()
        for i in l:
            i.join()
        end=time.time()
        print("run time is:%s" % (end-start))

    多线程,耗时2.1秒

    from threading import Thread
    import time
    def work():
        time.sleep(2)
    if __name__ == "__main__":
        l=[]
        start=time.time()
        for i in range(400):
            p = Thread(target=work)
            l.append(p)
            p.start()
        for i in l:
            i.join()
        end=time.time()
        print("run time is:%s" % (end-start))
  • 相关阅读:
    centos在设置时区
    Qt那点事儿(三) 论父对象与子对象的关系
    Qt多线程应用--QRunnable
    Qt学习之如何启动和终止一个线程
    Qt 互斥量 QMutex
    Qt网络获取本机网络信息
    QT程序拷贝 转移 改变运行环境
    Qt调用dll中的功能函数
    用Qt生成dll类库及调用方法
    Qt DLL总结【二】-创建及调用QT的 DLL
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9039107.html
Copyright © 2011-2022 走看看