go 中,进程退出如何保障异步协程的完整退出。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ml444
V2EX    Go 编程语言

go 中,进程退出如何保障异步协程的完整退出。

  •  
  •   ml444 2022-10-23 14:44:17 +08:00 2736 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写了一个 go 的异步 log 组件。为了保障异步的 channel 被彻底消费完,我增加了Exit()函数,但我想让调用无感知,不用刻意去调用这个函数。有没有什么办法或方式能够实现?

    package main import ( "os" "github.com/ml444/glog" ) func main() { // doing something log.Info("hello world") // doing something _ = log.Exit() 
    13 条回复    2022-11-04 18:53:45 +08:00
    0o0O0o0O0o
        1
    0o0O0o0O0o  
       2022-10-23 14:53:42 +08:00 via iPhone
    不能,一般用 defer 吧

    defer log.Exit()
    VANHOR
        2
    VANHOR  
       2022-10-23 14:58:43 +08:00
    确实得有一个地方来判断 channel 是否被消耗完了,所以还是得写上的。
    iyaozhen
        3
    iyaozhen  
       2022-10-23 15:09:47 +08:00
    理论上不能,所以很多时候需要在 main.go 加个 defer log.flush
    securityCoding
        4
    securityCoding  
       2022-10-23 17:25:36 +08:00 via Android
    可以在 new 方法内部,启动一个协程监听系统退出信号调用 exit
    Morriaty
        5
    Morriaty  
       2022-10-23 18:00:30 +08:00
    官方做法是 sync.WaitGroup ,主要三个函数

    group.Add(1) 每进入一个协程加一次计数
    defer group.Done() 协程结束标志,计数减一
    group.Wait() 等待计数清零,约等于你这里的 log.Exit()
    fuis
        6
    fuis  
       2022-10-23 18:56:13 +08:00
    td width="48" valign="top" align="center">jackliang007
        7
    jackliang007  
       2022-10-24 00:01:35 +08:00 via iPhone
    日志全部发送到消息队列,然后用开个协程来处理。
    bugfan
        8
    bugfan  
       2022-10-24 01:15:00 +08:00
    4 楼正解
    ml444
        9
    ml444  
    OP
       2022-11-04 17:51:51 +08:00
    @securityCoding 没用哦,我试过 panic 时,是收不到信号的
    securityCoding
        10
    securityCoding  
       2022-11-04 18:16:07 +08:00
    业务协程 panic 要他自己兜底 ,跟你的日志组件有啥关系?
    ml444
        11
    ml444  
    OP
       2022-11-04 18:19:15 +08:00
    @securityCoding panic 会导致异步日志丢失,所以我问的是有什么方式能够保障 panic 这种异常故障的时候,让日志能够写完再退出
    securityCoding
        12
    securityCoding  
       2022-11-04 18:51:39 +08:00 via Android
    @ml444 没理解你的意思,一般框架层都会做 recover 兜底,同时日志组件也需要定时 flush
    securityCoding
        13
    securityCoding  
       2022-11-04 18:53:45 +08:00 via Android
    @ml444 刷盘思路可以看下 zap 或者 gozero log
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5419 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 08:30 PVG 16:30 LAX 01:30 JFK 04:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86