热更新基本原理:
热更新主进程fork一个进程,然后子进程exec相应的程序。其中子进程会复用主进程的句柄,数据和堆栈。子进程一旦调用exec类函数,它本身就会“死亡”,系统把代码段替换为新的程序的代码,废弃原来的数据段和堆栈段,并为新程序分配新的数据段和堆栈段,只留下进程号。整体对系统而言,还是同一个进程,不过已经是另一个程序了。
具体步骤:
- 让子进程复用主进程的net.Listener的句柄,把句柄写在通过os.StartProcess的参数来附加Files
- 使用net.FileListener让这个句柄执行监听
- 每接受一个链接记录,查看是否还有没有服务完的链接。让老进程停止接收数据,让新进程接收数据。
grace模块是beego新增的一个独立支持热重启的模块。