求大神指教, 如何写一个全局recover,保证服务不会因为go程里面的panic整个挂掉

ywdhzxf · · 3669 次点击
既然给你代码了,那顺便把你一直想不通的解锁的问题一起贴给你吧。 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
更多评论
polaris
社区,需要你我一同完善!
没法全局,只能每个 gorouitne 自己 recover 自己。
#1
<a href="/user/polaris" title="@polaris">@polaris</a> 如果不考虑go程的话可以监听, 但是go程里面不知道咋监听...
#2