5.1.5 Process对象的其他属性与方法

p.start()  # 只是将命令交给操作系统,操作系统什么时候执行,主进程并不关心。主进程执行完p.start()交给操作系统后,就会立马执行下一条语句。

p.join() # 当主进程执行到p.join()时,会就等待p子进程执行完后,再继续下一语句。

不过,注意了,如果有多个子进程,并不是串行执行的。

因为多个子进程其实在后台是在并行执行的,主进程遇到p.join时只是做了判断子进程是否执行完了,执行完了就过,没执行完就等待,

所以主进程的执行时间,取决于最长的子进程的执行时间,而不是所有子进程执行时间之和。

p.is_alive()  # 查看进程是死是活

from multiprocessing import Process
import time
import os


class MyProcess(Process):    # 继承Process类
    def __init__(self, name, n):
        super().__init__()
        self.name = name
        self.n = n

    def run(self):   # 必须重写run方法
        print('%s 开始执行。。。。' % self.name)
        time.sleep(self.n)
        print('%s 执行结束。。。。' % self.name)


if __name__ == '__main__':
    start_time = time.time()
    p1 = MyProcess('子进程p1', 3)
    p2 = MyProcess('子进程p2', 5)
    p3 = MyProcess('子进程p3', 2)

    # p1.start()
    # p2.start()
    # p3.start()
    # 
    # p1.join()
    # p2.join()
    # p3.join()
    
    p_l = [p1, p2, p3]
    for p in p_l:
        p.start()

    for p in p_l:
        p.join()

    print('主线程的执行时间是:', time.time() - start_time)

输出结果:

子进程p1 开始执行。。。。
子进程p2 开始执行。。。。
子进程p3 开始执行。。。。
子进程p3 执行结束。。。。
子进程p1 执行结束。。。。
子进程p2 执行结束。。。。
主线程的执行时间是: 5.0111658573150635

串行执行:

from multiprocessing import Process
import time
import os


class MyProcess(Process):    # 继承Process类
    def __init__(self, name, n):
        super().__init__()
        self.name = name
        self.n = n

    def run(self):   # 必须重写run方法
        print('%s 开始执行。。。。' % self.name)
        time.sleep(self.n)
        print('%s 执行结束。。。。' % self.name)


if __name__ == '__main__':
    start_time = time.time()
    p1 = MyProcess('子进程p1', 3)
    p2 = MyProcess('子进程p2', 5)
    p3 = MyProcess('子进程p3', 2)
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    print('主线程的执行时间是:', time.time() - start_time)

执行结果:

子进程p1 开始执行。。。。
子进程p1 执行结束。。。。
子进程p2 开始执行。。。。
子进程p2 执行结束。。。。
子进程p3 开始执行。。。。
子进程p3 执行结束。。。。
主线程的执行时间是: 10.029819011688232

p.is_alive()演示:

from multiprocessing import Process
import time
import os


class MyProcess(Process):    # 继承Process类
    def __init__(self, name, n):
        super().__init__()
        self.name = name
        self.n = n

    def run(self):   # 必须重写run方法
        print('%s 开始执行。。。。' % self.name)
        time.sleep(self.n)
        print('%s 执行结束。。。。' % self.name)


if __name__ == '__main__':
    start_time = time.time()
    p1 = MyProcess('子进程p1', 3)
    p2 = MyProcess('子进程p2', 5)
    p3 = MyProcess('子进程p3', 2)

    print(p1.is_alive())

    p_l = [p1, p2, p3]
    for p in p_l:
        p.start()

    print(p1.is_alive())
    
    for p in p_l:
        p.join()

    print(p1.is_alive())

    print('主线程的执行时间是:', time.time() - start_time)
View Code

输出结果:

False     #子进程未start
True      #子进程start后join前
子进程p1 开始执行。。。。
子进程p2 开始执行。。。。
子进程p3 开始执行。。。。
子进程p3 执行结束。。。。
子进程p1 执行结束。。。。
子进程p2 执行结束。。。。
False   #join后,子进程结束后
主线程的执行时间是: 5.012630939483643

猜你喜欢

转载自www.cnblogs.com/beallaliu/p/9190071.html