利用守护进程daemon实现心跳机制
背景:
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
在Linux系统中,计算机刚启动时只有一个进程,PID为1,名字为init(centos6系统)或者systemd(centos7系统),systemd进程通过复制自身进程启动了其它进程,后面再复制出整个计算机进程,所以进程被设计成独立的,也就是说父进程关闭了,子进程照样能正常运行,这是非常必要的,不至于其中一个进程挂了,让它的子孙后代进程都挂掉。
但如果我们在主进程中开启一个子进程用于向远方服务器报告,这种进程间的独立就不符合我们的期望,而daemon参数可以实现主进程与子进程的绑定,主进程结束,守护进程的子进程也结束,如下
from multiprocessing import Process
import time
def child_main():
while True:
print('i am live')
time.sleep(3)
if __name__ == '__main__':
p = Process(target=child_main, daemon=True)
p.start()
time.sleep(10)
print('main end')
- 这里没有使用join()方法等待子进程,所以在运行10秒后主进程结束,
- 由于参数daemon=True ,所以子进程在主进程结束后也跟着结束了。