zoukankan      html  css  js  c++  java
  • ~~并发编程(九):多线程与多进程~~

    进击の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进行了修改,改变主进程里面的数据

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


    *****
    *****
  • 相关阅读:
    关于Lucas定理、多项式Exp的一些思考
    Binet-Cauchy定理的证明
    CSP2019 树上的数 题解
    Graphviz学习
    Luogu P2221 [HAOI2012]高速公路题解
    CSP2019 树的重心 题解
    CSP2019 Emiya 家今天的饭 题解
    UVA10559 方块消除 Blocks 题解
    关于二次项系数为1的二元一次不定方程解法的探究
    关于对STL容器重载运算符的问题
  • 原文地址:https://www.cnblogs.com/jevious/p/11403965.html
Copyright © 2011-2022 走看看