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))
  • 相关阅读:
    【转】排序总结(总结的非常好)
    [转]C#中使用指针实现高效比较字符串的小技巧
    高斯消元法
    排序算法性能和使用场景总结
    斐波那契数列Log(n)算法
    C#部分方法定义
    杂项记录
    C#指针复习示例zz
    【转】斐波那契数列算法分析
    【转】矩阵乘法
  • 原文地址:https://www.cnblogs.com/yaya625202/p/9039107.html
Copyright © 2011-2022 走看看