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,)