zoukankan      html  css  js  c++  java
  • python 并发编程 多线程与多进程的区别

    1.开进程的开销远大于开线程

    2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的

    1 开进程的开销远大于开线程
    from multiprocessing import Process
    
    def work():
        print('hello')
    
    if __name__ == '__main__':
        #在主进程下开启子进程
        p = Process(target=work)
        p.start()
        print('主进程')
        
        
    '''
    主进程
    hello
    '''

    执行结果如下,p.start ()将开启进程的信号发给操作系统后,操作系统要申请内存空间,让好拷贝父进程地址空间到子进程,开销远大于线程

    先打印的是主进程

     
    from threading import Thread
    
    def work():
        print('hello')
    
    if __name__ == '__main__':
        t = Thread(target=work)
        t.start()
        print('主线程')
    
    
    '''
    hello
    主线程
    '''
    
    

    执行结果如下,几乎是t.start ()的同时就将线程开启了,然后先打印出了hello,开线程不用申请内存空间,证明线程的创建开销极小

    2 同一进程内的线程共享该进程的数据?

    1、进程之间地址空间是隔离的

    from multiprocessing import Process
    
    def work():
        global n
        n = 0
    
    if __name__ == '__main__':
        n = 100
        p = Process(target=work)
        p.start()
        p.join()
        print('', n)
    
    
    '''
    主 100
    '''
    
    
    执行结果如下,毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100,
    子进程不影响主进程


    2、同一进程内开启的多个线程是共享该进程地址空间的
    # 2 同一进程内的多个线程共享该进程的地址空间
    
    from threading import Thread
    
    def work():
        global n
        n = 0
    
    if __name__ == '__main__':
        n = 100
        t = Thread(target=work)
        t.start()
        t.join()
        print('',n)
    
    '''
    主 0
    '''
    
    

    执行结果如下, 查看结果为0, 因为同一进程内的线程之间共享进程内的数据 

     
    三 pid
    1.开多个进程,每个进程都有不同的pid

    current_process 可以查看pid
    # 3 pid
    
    from multiprocessing import Process
    from multiprocessing import current_process
    
    # current_process 可以查看pid
    
    def work(name):
        print("%s" %name,current_process().pid)  # 当前子进程id
    
    if __name__ == '__main__':
    
        p = Process(target=work, args=("子进程",))
        p.start()
        print('', current_process().pid)  # 主进程id
    
    
    '''
    主 5880
    子进程 5092
    '''
    
    

    os模块查看pid
    from multiprocessing import Process
    import os
    
    
    def work():
        print("子进程:%s , 父进程:%s" %(os.getpid(), os.getppid()))  # 子进程pid
    
    if __name__ == '__main__':
    
        p = Process(target=work)
        p.start()
        print('', os.getpid())  # 主进程pid
    
    
    '''
    主 15420
    子进程:17024 , 父进程:15420
    '''
    
    

    2.在主进程下开启多个线程,每个子线程都跟主进程的pid一样

    他们同属一个进程

    # 3 pid
    
    from threading import Thread
    import os
    
    
    def work():
        print("子线程PID:%s" %(os.getpid()))  # 子线程pid
    
    if __name__ == '__main__':
    
        t = Thread(target=work)
        t.start()
        print('', os.getpid())  # 主线程pid
    
    
    '''
    子线程PID:4328
    主 4328
    '''
     
    
    
    
     
    
    
    
     
  • 相关阅读:
    函数(方法
    变量
    常量
    文档注释与多行注释的区别
    标识符
    [置顶] WebService学习总结(3)——使用java JDK开发WebService
    WebService学习总结(2)——WebService是什么?
    [置顶] WebService学习总结(1)——WebService相关概念
    [置顶] WebService学习总结(1)——WebService相关概念
    Java基础学习总结(38)——Lombok的使用和原理
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/9015342.html
Copyright © 2011-2022 走看看