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:

猜你喜欢

转载自www.cnblogs.com/wangdianchao/p/12032019.html