"""
1、进程的start方法执行进程。
2、join方法阻塞主进程,需要等待对应的子进程结束后再继续执行主进程。
3、多进程中必须使用join方法,避免出现僵尸进程
"""

from multiprocessing import Process
import time
"""
1、定义函数Foo1,打印循环是第几环个进程。
2、我们在函数Foo1中增加不同的sleep时间来证明是多进程并发执行的(如果是并行会按照执行完成的先后顺序打印,
   如果是串行会按照123的顺序打印)
3、创建空列表p_list,将三个子进程放入该列表,用于执行join
4、创建3个子进程执行Foo函数传递循环次数i
5、执行子进程(start)
6、执行阻塞(join)
"""
def foo1(n):
    m_list = [3, 2, 1]
    time.sleep(m_list[n-1])
    print('这是第{}个进程'.format(n))


if __name__ == '__main__':
    p_list = []
    for i in range(1, 4):
        p = Process(target=foo1, args=(i,))
        p.start()
        p_list.append(p)

    for j in p_list:
        j.join()


"""疑问:为什么要先通过循环执行3个子进程,再通过循环阻塞
1、因为join会阻塞主进程,如果执行一个子进程就阻塞,就会导致三个进程不是并发执行的而是串行的。
2、看下面的例子,我们将start和join放在一个循环中,这样就会先执行一个进程的start和join,然后在循环执行下一个进程。
3、可以看到他们的输出结果,永远都是1,2,3。说明是串行的。
"""
def foo2(n):
    m_list = [3, 2, 1]
    time.sleep(m_list[n-1])
    print('这是第{}个进程'.format(n))


if __name__ == '__main__':
    for i in range(1, 4):
        p = Process(target=foo2, args=(i,))
        p.start()
        p.join()

原创文章,转载请注明出处:http://124.221.219.47/article/46778/