• python_并发编程——多进程


    from multiprocessing import Process
    import os
    
    def func1():
        print('子进程1',os.getpid())   #子进程:获取当前进程的进程号
        print('子进程的父进程:', os.getppid()) #获取进程的父进程id
    def func2():
        print('子进程2',os.getpid())
        print('子进程的父进程:', os.getppid())
    def func3():
        print('子进程3',os.getpid())
        print('子进程的父进程:', os.getppid())
    
    if __name__ == '__main__':
        p1 = Process(target=func1)  #注册:将函数名(内存地址)注册进子进程
        p2 = Process(target=func2)  #p1是一个进程对象
        p3 = Process(target=func3)
        p1.start()  #开启了一个子进程
        p2.start()  #三个并行的子进程
        p3.start()
        print('父进程:',os.getpid())  #父进程:获取当前进程的进程号
        print('父进程的父进程:', os.getppid()) #获取进程的父进程id

      子进程的执行顺序会变化,说明三个子进程是并行的。

      传递参数:

    from multiprocessing import Process
    import os
    
    def func1(args):    #args接收参数
        print('子进程1',os.getpid())   #子进程:获取当前进程的进程号
        print('子进程的父进程:', os.getppid()) #获取进程的父进程id
        print(args)     #打印传递进来的参数
    
    
    if __name__ == '__main__':
        p1 = Process(target=func1,args=('参数',))   #以元组的形式传递参数,如果只传递一个参数必须要加一个逗号
        p1.start()
        print('父进程:',os.getpid())  #父进程:获取当前进程的进程号
        print('父进程的父进程:', os.getppid()) #获取进程的父进程id

    结果:

      开启多个子进程方法:

    from multiprocessing import Process
    
    def func1(args):
        print('*'*args)
    
    if __name__ == '__main__':
        # 可以使用for循环实现开启多个子进程
        for i in range(1,5):
            p1 = Process(target=func1,args=(i,))
            p1.start()

    结果1:  结果2:

       多进程join()方法:

    from multiprocessing import Process
    
    def func1(args):
        print('子进程1')
        print(args)
    
    if __name__ == '__main__':
        p1 = Process(target=func1,args=('参数',))
        p1.start()
        print('hahahahha')
        # 感知一个子进程的结束,将异步变为同步:join之前为异步
        p1.join()
        # join之后为同步
        print('qqqqqqqqq')

    结果:

    实践:我们想实现先异步输出10句话,最后同步输出执行完毕的结果。

    from multiprocessing import Process
    
    def func1(args):
        print('*'*args)
    
    if __name__ == '__main__':
        for i in range(10):
            p1 = Process(target=func1,args=(i,))
            p1.start()
        p1.join()
        print('执行完毕!')

    但是我们发现,“执行完毕”四个字总是跟随在最长的一句话后面打印输出,然而因为上面10句话是异步的,最长的那句话并不是每次都最后输出,所以我们这样不能现实我们的需求。

    from multiprocessing import Process
    
    def func1(args):
        print('*'*args)
    
    if __name__ == '__main__':
        p_list = [] #创建一个空列表用来存放等会生产的进程对象
        for i in range(10):
            p1 = Process(target=func1,args=(i,))
            p_list.append(p1)#将每个进程对象依次存放进列表中
            p1.start()
        [i.join() for i in p_list]  # 运用列表推导式:循环列表,依次对列表中的进程对象执行join()方法。之前所有进程必须在这里执行完才能执行下面的代码。
        print('执行完毕!')

    结果1:  结果2:

  • 相关阅读:
    socket.io建立长连接
    编译性语言、解释性语言和脚本语言的区别
    回调函数
    jquery文档处理
    css--Bootstrap框架
    css--960框架
    html基础
    真的理解闭包了吗,用闭包的时候应该注意什么?
    初识reactJs 相关
    简单方便的div垂直居中。
  • 原文地址:https://www.cnblogs.com/wangdianchao/p/12032019.html
Copyright © 2020-2023  润新知