开启进程的 两种方式

重要结论:

1、p.join([timeout]):是Process模块给我们提供的对子进程同步管理的方法!
timeout是可选的超时时间,如 timeout=2 就是罩着这个线程2s 以后,就不管他了,继续执行下面的代码。

 

2、主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态),
 需要强调: p.join只能join住start开启的进程,而不能join住run开启的进程

 

3、p.join()是让主线程等待p的结束,卡主的是主进程而不是子进程p!


4、如果有多个进程同时join,花费的总时间仍是耗时最长的那个进程的运行时间,不是所有运行的时间的和!

 

一、函数方法

# -*- coding:utf-8 -*-
import os
import time
from multiprocessing import Process

def task(name):
    print('%s is running,pid:%s'%(name,os.getpid()))
    time.sleep(1.5)
    print('%s is done'%name)

if __name__ == '__main__':
    lis = []
    for i in range(1,4):
        p = Process(target=task,args=('whw-%s'%i,))
        lis.append(p)
        p.start()

    for i in lis:
        i.join()
    print('主进程...')

效果:

二、面向对象的方法

# -*- coding:utf-8 -*-
import os
import time
from multiprocessing import Process

# 必须继承 Process
class MyProcess(Process):
    # 需要的参数在init方法中传
    def __init__(self,name):
        # 注意继承父类的init方法
        super().__init__()
        self.name = name

    # 注意必须叫run
    def run(self):
        print('%s is running,pid:%s'%(self.name,os.getpid()))
        time.sleep(1.5)
        print('%s is done'%self.name)

if __name__ == '__main__':
    lis = []
    for i in range(1,4):
        p = MyProcess('wanghw-%s'%i)
        lis.append(p)
        # start会自动调用run
        p.start()

    for i in lis:
        i.join()

    print('主线程')

效果:

posted on 2019-04-16 09:36  江湖乄夜雨  阅读(326)  评论(0编辑  收藏  举报