ghttp.Server热重启机制在windows系统下的兼容性测试

This commit is contained in:
John
2018-05-16 17:19:16 +08:00
parent d4b64a5bcf
commit 6ca634e85b
2 changed files with 5 additions and 20 deletions

View File

@ -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)
}

View File

@ -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()
}