• 进程和线程的区别


    进程:是计算机中资源分配的最小单位

    线程:是计算机中cpu调度的最小单位

    1 pid考虑

       多进程的时候每个子进程有自己的pid

       多个线程共享一个进程pid

    2 数据隔离和共享

       多进程之间数据隔离

       线程之间全局变量都是共享的

    3 main

       进程必须写 if __name__ == '__main__':

       线程由于共享进程的代码,不需要再执行文件中的代码,不需要加上if __name__ == '__main__':

    4 效率差别

       进程的开启和销毁消耗的时间长

       线程的开启和销毁消耗的时间远远小于进程

    5 GIL(全局解释器锁)

      cpython解释器的GIL 导致python不能有效的利用多核

      GIL锁的是线程

    6 守护进程和守护线程 

       守护进程会随着主进程的代码结束而结束,守护进程只关心主进程的执行情况,而不会等待其他子进程的结束

       守护线程会随着主线程的结束而结束,而主线程也会等待子线程结束才结束,所以守护线程会等待包括子线程在内的所有线程都结束之后才结束

      举一个例子

    from threading import Thread
    import threading
    from multiprocessing import Process
    import os
    import time
    
    def func1():
        while True:
            time.sleep(0.5)
            print('in func1')
    def func2():
        print('start func2')
        time.sleep(5)
        print('end func2')
    if __name__ == '__main__':
        t=Process(target=func1)
        t.daemon=True
        t.start()
        t2=Process(target=func2)
        t2.start()
        print('')
    '''
    守护线程的情况
    start func2
    in func1
    in func1
    in func1
    in func1
    in func1
    in func1
    in func1
    in func1
    in func1
    end func2
    
    #守护进程的情况,守护进程会在主进程代码执行结束后就终止
    主
    start func2
    end func2
    '''
    View Code

     7 使用场景

    计算密集型  ------------》采用多进程

    # from multiprocessing import Process
    # from threading import Thread
    # import os,time
    # def work():
    #     res=0
    #     for i in range(10000000): #计算密集型
    #         res*=i
    #
    #
    # if __name__ == '__main__':
    #     l=[]
    #     start=time.time()
    #     for i in range(8):
    #         p=Process(target=work) #2.0842249393463135
    #         p=Thread(target=work) # 9.089839935302734
    #         l.append(p)
    #         p.start()
    #     for p in l:
    #         p.join()
    #     stop=time.time()
    #
    #     print('run time is %s'%(stop-start))
    计算密集型

    I/O密集型 ----------------》采用多线程

    from multiprocessing import Process
    from threading import Thread
    import os,time
    def work():
        time.sleep(2) #I/O型
    
    if __name__ == '__main__':
        l=[]
        start=time.time()
        for i in range(8):
            # p=Process(target=work) #2.417990207672119
            p=Thread(target=work) #2.004342794418335
            l.append(p)
            p.start()
        for p in l:
            p.join()
        stop=time.time()
    
        print('run time is %s'%(stop-start))
    I/O密集型

     8 数量限制

    进程的数量非常有限: cpu的个数 +1    ,多进程能利用多核,实现高计算

    线程的数量限制:   cpu的个数 * 5         ,多线程能够实现并发,适合高i/o型

       

  • 相关阅读:
    雪花算法解决的问题
    ServiceStack6000次限制破解
    电商 详情页面 nginx 配置 优先请求静态页,若没有请求动态页,同时生成静态页
    docker 使用汇总
    .net 5 新特性 -- EFCoreDBFirst 介绍 和 .NET5 AOP 5个Filter
    模板方法设计模式:定义抽象类-模板:定义业务流程,执行步骤--》各业务类继承抽象类,实现各自不同 具体的执行步骤
    通过代理模式(包一层),实现对业务增加功能如日志,异常处理,缓存结果,到达不破坏原有的业务代码,扩展了功能
    设计模式
    mongodb 基本操作(增删改查),事务,数据失效机制
    log4net.Config
  • 原文地址:https://www.cnblogs.com/mmyy-blog/p/9441708.html
Copyright © 2020-2023  润新知