mirror of
https://gitee.com/johng/gf
synced 2026-06-07 10:22:11 +08:00
ghttp.Server热重启机制在windows系统下的兼容性测试
This commit is contained in:
@ -7,8 +7,8 @@
|
||||
package ghttp
|
||||
|
||||
import (
|
||||
"os"
|
||||
"gitee.com/johng/gf/g/os/gproc"
|
||||
"os"
|
||||
)
|
||||
|
||||
// 开启所有Web Server(根据消息启动)
|
||||
@ -17,11 +17,9 @@ func onCommChildStart(pid int, data []byte) {
|
||||
sendProcessMsg(gproc.PPid(), gMSG_NEW_FORK, nil)
|
||||
// 如果创建自己的父进程非gproc父进程,那么表示该进程为重启创建的进程,创建成功之后需要通知父进程自行销毁
|
||||
if gproc.PPidOS() != gproc.PPid() {
|
||||
sendProcessMsg(gproc.PPidOS(), gMSG_SHUTDOWN, nil)
|
||||
// 在windows下必须等待父进程销毁后才能表明Server资源已被释放,才能开始端口监听,否则会端口资源冲突
|
||||
if p, err := os.FindProcess(gproc.PPidOS()); err == nil {
|
||||
p.Wait()
|
||||
}
|
||||
if p, err := os.FindProcess(gproc.PPidOS()); err == nil {
|
||||
p.Kill()
|
||||
}
|
||||
}
|
||||
// 开启Web Server服务
|
||||
serverMapping.RLockFunc(func(m map[string]interface{}) {
|
||||
@ -30,6 +28,6 @@ func onCommChildStart(pid int, data []byte) {
|
||||
}
|
||||
})
|
||||
// 开始心跳时必须保证主进程时间有值,但是又不能等待主进程消息后再开始检测,因此这里自己更新一下通信时间
|
||||
updateProcessChildUpdateTime()
|
||||
updateProcessUpdateTime()
|
||||
checkHeartbeat.Set(true)
|
||||
}
|
||||
@ -16,7 +16,6 @@ import (
|
||||
// 文件锁
|
||||
type Locker struct {
|
||||
mu sync.RWMutex // 用于外部接口调用的互斥锁(阻塞机制)
|
||||
fmu sync.RWMutex // 用于保证方法内部操作的原子性互斥锁
|
||||
flock *flock.Flock // 底层文件锁对象
|
||||
}
|
||||
|
||||
@ -44,8 +43,6 @@ func (l *Locker) IsLocked() bool {
|
||||
|
||||
// 尝试Lock文件,如果失败立即返回
|
||||
func (l *Locker) TryLock() bool {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
ok, _ := l.flock.TryLock()
|
||||
if ok {
|
||||
l.mu.Lock()
|
||||
@ -55,8 +52,6 @@ func (l *Locker) TryLock() bool {
|
||||
|
||||
// 尝试RLock文件,如果失败立即返回
|
||||
func (l *Locker) TryRLock() bool {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
ok, _ := l.flock.TryRLock()
|
||||
if ok {
|
||||
l.mu.RLock()
|
||||
@ -65,29 +60,21 @@ func (l *Locker) TryRLock() bool {
|
||||
}
|
||||
|
||||
func (l *Locker) Lock() {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
l.mu.Lock()
|
||||
l.flock.Lock()
|
||||
}
|
||||
|
||||
func (l *Locker) UnLock() {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
l.flock.Unlock()
|
||||
l.mu.Unlock()
|
||||
}
|
||||
|
||||
func (l *Locker) RLock() {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
l.mu.RLock()
|
||||
l.flock.RLock()
|
||||
}
|
||||
|
||||
func (l *Locker) RUnlock() {
|
||||
l.fmu.Lock()
|
||||
defer l.fmu.Unlock()
|
||||
l.flock.Unlock()
|
||||
l.mu.RUnlock()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user