zoukankan      html  css  js  c++  java
  • (三)多线程之多线程与多进程的区别

    一、谁的开启速度快?


    1,在主进程下开启子进程

    import time
    from multiprocessing import Process
    
    def say_hi(name):
        print('%s say hi!' % name)
        time.sleep(2)
        print('%s say hello!' % name)
    
    if __name__ == '__main__':
        p = Process(target=say_hi,args=('zixi',))
        p.start()
        print('主线程')
    
    """
    主线程
    zixi say hi!
    zixi say hello!
    """
    开进程

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

    2,在主进程下开启线程

    import time
    from threading import Thread
    
    def say_hi(name):
        print('%s say hi!' % name)
        time.sleep(2)
        print('%s say hello!' % name)
    
    if __name__ == '__main__':
    
        t = Thread(target=say_hi,args=('zixi',))
        t.start()
    
        print('主线程')
    
    """
    zixi say hi!
    主线程
    zixi say hello!
    """
    开线程

    几乎是 t.start () 的同时就将线程开启了,然后先打印出了zixi say hi!,证明线程的创建开销极小。

    二、同一进程内的多个线程共享该进程的数据


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

    from multiprocessing import Process
    
    n = 100
    
    def task():
        global n
        n = 0
    
    if __name__ == '__main__':
        p = Process(target=task,)
        p.start()
        p.join()
    
        print('主线程',n)
    
    # 主线程 100

    毫无疑问子进程 p 已经将自己的全局的 n 改成了0,但改的仅仅是它自己的,查看父进程的 n 仍然为100。

    2,同一进程内开启的多个线程是共享该进程地址空间的

    from threading import Thread
    
    n = 100
    
    def task():
        global n
        n = 0
    
    if __name__ == '__main__':
        t = Thread(target=task,)
        t.start()
        t.join()
    
        print('主线程',n)
    
    # 主线程 0

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

    三、看一下 pid


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

    from multiprocessing import Process
    import os
    
    def task():
        print("子进程PID:%s    父进程PID:%s" % (os.getpid(),os.getppid()))
    
    if __name__ == '__main__':
        p1 = Process(target=task,)
        p2 = Process(target=task,)
        p1.start()
        p2.start()
    
        print('主线程',os.getpid())
    
    """
    主线程 11256
    子进程PID:1416    父进程PID:11256
    子进程PID:18872    父进程PID:11256
    """

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

    from threading import Thread
    import os
    
    def task():
        print("线程PID:%s" % (os.getpid()))
    
    if __name__ == '__main__':
        t1 = Thread(target=task,)
        t2 = Thread(target=task,)
        t1.start()
        t2.start()
    
        print('主线程',os.getpid())
    
    """
    线程PID:10288
    线程PID:10288
    主线程 10288
    """
  • 相关阅读:
    HashMap 的实现原理(1.8)
    HashMap 的实现原理(1.7)
    Java面试总结 -2018(补录)
    在java中写出完美的单例模式
    ArrayList实现原理分析
    Ngigx+Tomcat配置动静分离,负载均衡
    微信小程序——常用快捷键【四】
    Linux服务器下安装vmware虚拟机
    微信小程序——部署云函数【三】
    微信小程序——安装开发工具和环境【二】
  • 原文地址:https://www.cnblogs.com/zoling7/p/13386535.html
Copyright © 2011-2022 走看看