• ~~并发编程(九):多线程与多进程~~


    进击のpython

    *****

    并发编程——多线程与多进程


    本小节就一个要求

    掌握在一个进程下开启多个子进程与在一个进程下开启多个线程的区别

    开始操作


    开启速度

    在主进程中开启线程

    from threading import Thread
    
    
    def work():
        print('hello')
    
    
    if __name__ == '__main__':
        for i in range(10):
            t = Thread(target=work)
            t.start()
        print('主线程/主进程')
            
    

    可以发现执行的很快

    在主进程中开启线进程

    from multiprocessing import Process
    
    
    def func():
        print('我是子进程')
        pass
    
    
    if __name__ == '__main__':
        for i in range(10):
            p = Process(target=func)
            p.start()
        print('主进程')
        
    

    相比较来说你会发现线程要更快

    其实一想也是,开十个进程相当于十个进程+十个线程

    那时间上指定要比十个线程要长


    pid

    在进程里查看pid

    import os
    from multiprocessing import Process
    
    
    def func():
        print('我是子进程', os.getpid())
        pass
    
    
    if __name__ == '__main__':
        for i in range(10):
            p = Process(target=func)
            p.start()
        print('主进程', os.getpid())
    
    

    我们可以看到,因为是新开的进程,所以每个进程的id都不同

    主进程 1516
    我是子进程 6800
    我是子进程 440
    我是子进程 1840
    我是子进程 7892
    我是子进程 228
    我是子进程 6464
    我是子进程 4628
    我是子进程 4944
    我是子进程 4244
    我是子进程 2300
    

    在线程里查看pid

    import os
    from threading import Thread
    
    
    def func():
        print('我是子进程', os.getpid())
        pass
    
    
    if __name__ == '__main__':
        for i in range(10):
            p = Thread(target=func)
            p.start()
        print('主进程', os.getpid())
    
    

    打印结果上可以看出,多线程的开启时基于一个进程开启

    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    我是子进程 11228
    主进程 11228
    

    数据共享

    进程的数据

    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

    尽管在子进程里对全局变量中的n进行了修改,但是没有改变主进程里面的数据

    所以可以说明,在进程中,数据是不互通的

    线程的数据

    from threading import Thread
    
    
    def work():
        global n
        n = 0
    
    
    if __name__ == '__main__':
        n = 100
        p = Thread(target=work)
        p.start()
        p.join()
        print('主', n)
    
    

    可以看到打印结果是 0

    在子线程里对全局变量中的n进行了修改,改变主进程里面的数据

    所以可以说明,在线程中,数据是互通的


    *****
    *****
  • 相关阅读:
    《算法笔记》9. 培养贪心思维、贪心算法深度实践
    《算法笔记》8. 二叉树的递归思维实战
    《算法笔记》7. 二叉树基本算法整理
    《算法笔记》6. 链表相关面试题总结
    大家是怎么做APP接口的版本控制的?欢迎进来看看我的方案。升级版的Versioning
    secure 审计暴力登陆
    linux 查询登陆成功、失败的用户
    win10 ctrl与alt键互换
    如何保证外包团队接入企业内网安全
    学习正则匹配的一些经验
  • 原文地址:https://www.cnblogs.com/jevious/p/11403965.html
Copyright © 2020-2023  润新知