并发进程——Process对象的方法属性

join方法

让主进程检测子进程是否运行完毕,在子进程执行完毕后才继续执行,否则一直在原地阻塞

def test(name):
    print('%s is running' % name)
    time.sleep(3)
    print('done')

if __name__ == '__main__':
    p1 = Process(target=test, args=('p1',))
    p1.start()
    p1.join()  # 主程序检测等待
    print('主进程')


# p1 is running
# done
# 主进程


没有join之前的:
# 主进程
# p1 is running
# done

再看一个,检测下多个子进程的并行还是串行:如果是串行,等待一个子进程结束之后再运行,那运行时间应该是总和,如果是并行,那运行时间应该是时间最长的那个。

def test(name, n):
    print('%s is running' % name)
    time.sleep(n)  # 每个子进程睡眠时间
    print('done')

if __name__ == '__main__':
    start = time.time()  #记录下初始时间
    p1 = Process(target=test, args=('p1', 3))
    p2 = Process(target=test, args=('p2', 5))
    p3 = Process(target=test, args=('p3', 2))
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    print('主进程')
    print(time.time()-start)  # 记录运行时间



# p1 is running
# p2 is running
# p3 is running
# done
# done
# done
# 主进程
# 5.219203472137451

由此看出,join方法是让主进程检测等待,而三个子进程向操作系统发送信号之后是并发执行的。如果是下面这种情况,则是串行的:


def test(name, n):
    print('%s is running' % name)
    time.sleep(n)
    print('done')

if __name__ == '__main__':
    start = time.time()
    p1 = Process(target=test, args=('p1', 3))
    p2 = Process(target=test, args=('p2', 5))
    p3 = Process(target=test, args=('p3', 2))
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    print('主进程')
    print(time.time()-start)


# p1 is running
# done
# p2 is running
# done
# p3 is running
# done
# 主进程
# 10.628840684890747

进程对象的其他方法一:terminate与is_alive

terminate 发信号给操作系统关闭进程,操作系统需要反应时间,不会立即关闭,用 is_alive查看是否还在,返回True 或False

进程对象的其他属性:name与pid

name查看属性名,pid查看进程号

def test(name, n):
    print('%s is running' % name)
    time.sleep(n)
    print('done')

if __name__ == '__main__':
    start = time.time()
     p1 = Process(target=test, args=('p1', 3),name='子进程1')
    ) #可以用关键参数来指定进程名
    p1.start()

    print(p1.name,p1.pid,)

猜你喜欢

转载自blog.csdn.net/Light__1024/article/details/86485004