我们的项目用的iris框架, 在接口里面开启go程后如果go程 panic 了, 则整个服务都会挂掉, 能不能写一个全局的 recover来监听go程的 panic
既然给你代码了,那顺便把你一直想不通的解锁的问题一起贴给你吧。
https://play.golang.com/p/GahJPr0GYNj
来,看看锁解了没?
觉得print没有说服力?
那我再给个文件锁的例子吧
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"time"
)
//set this path under your tmp folder
const lockfile = "/tmp/gotestfilelock"
func lock() error {
fmt.Println("locked")
return ioutil.WriteFile(lockfile, []byte("This file shoud be deleted after unlock"), 0600)
}
func unlock() error {
fmt.Println("unlocked")
return os.Remove(lockfile)
}
func task1() {
//comment or uncomment next line to show normal unlock
// defer unlock()
panic(errors.New("error rasied"))
}
func task2() {
defer unlock()
lock()
time.Sleep(100 * time.Second)
unlock()
}
func main() {
os.Remove(lockfile)
go task2()
time.Sleep(1 * time.Second)
go task1()
time.Sleep(1 * time.Second)
}
来。跑一下,看看task1的panic有没有把task2的文件锁解锁了?上锁的文件还在不在那?
不用担心我的unlock函数写的不对,可以把task1的defer里的unlock放出来对比一下。
半桶水就少说多看,别出来误导人。
#41
更多评论
<a href="/user/polaris" title="@polaris">@polaris</a> 如果不考虑go程的话可以监听, 但是go程里面不知道咋监听...
#2