zoukankan      html  css  js  c++  java
  • 进程与线程的区别

    一 开启线程速度快于进程

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

      进程

    # 1、开进程的开销远大于开线程的
    
    import time
    from multiprocessing import Process
    
    
    def work(name):
        print("%s is working " % name)
        time.sleep(2)
        print("%s end" % name)
    
    
    if __name__ == "__main__":
        p1 = Process(target=work, args=("进程1", ))
        p1.start()     # print("主线程")打印完了,子进程才起来
    
        print("主进程")
    

      执行结果

    主进程
    进程1 is working
    进程1 end

    线程

    import time
    from threading import Thread
    
    
    def work(name):
        print("%s is working " % name)
        time.sleep(2)
        print("%s end" % name)
    
    
    if __name__ == "__main__":
        t1 = Thread(target=work, args=("线程1", ))
        t1.start()      # 指令发出,效果立马出现
        print("主线程")
    

      执行结果

    线程1 is working
    主线程
    线程1 end

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

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

    from multiprocessing import Process
    
    n = 100
    def task():
        global n
        n = 0
    
    if __name__ == "__main__":
        p1 = Process(target=task,)
        p1.start()    # 主进程n=100,子进程n=0(改的是子进程的,不影响主进程)
        p1.join()
    
        print("主进程", n)

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

    主进程 100
    

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

    from threading import Thread
    
    n = 100
    def task():
        global n
        n = 0
    
    if __name__ == "__main__":
        t1 = Thread(target=task, )
        t1.start()      # 发信号后,在同一进程中开了一个线程,共享进程资源
        t1.join()
    
        print("主线程", n)

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

    主 0

    三 查看pid

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

    from threading import Thread
    import os
    
    
    def task():
        print("线程1PID:%s " % os.getpid())
    
    if __name__ == "__main__":
        t1 = Thread(target=task, )
        t1.start()
    
        print("主线程", os.getpid())

    执行结果

    线程1PID:6436
    主线程 6436

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

    from multiprocessing import Process, current_process
    import os
    
    
    def task():
        # print(current_process().pid)
        print("子进程PID:%s | 父进程PID:%s" %(os.getpid(), os.getppid()))
    
    if __name__ == "__main__":
        p1 = Process(target=task,)
        p1.start()
    
        # print("主进程", current_process().pid)
        print("主进程", os.getpid())

    执行结果

    主进程 6232
    14912
    子进程PID:14912 | 父进程PID:6232

     
  • 相关阅读:
    Linux Apache服务(一)
    mysql基础
    linux面试题一
    linux shell(2)
    linux基础汇总2
    python列表生成式、生成器,迭代器与二分法
    python的函数
    python函数
    java 翁老师学习笔记-持续更
    责任链模式
  • 原文地址:https://www.cnblogs.com/fantsaymwq/p/10129320.html
Copyright © 2011-2022 走看看