zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    HDU-2602-Bone Collector
    HDU-1171-Big Event in HDU
    javascript概要
    核桃的数量
    P3372 【模板】线段树 1
    P3373 【模板】线段树 2
    拿糖果
    第二点五个不高兴的小明
    树的直径
    1240. 完全二叉树的权值
  • 原文地址:https://www.cnblogs.com/wangdianchao/p/12032019.html
Copyright © 2011-2022 走看看