如何实现对éžç¼“冲通é“çš„éžé˜»å¡žå†™å…¥ï¼Ÿ

时间:2018-02-23 17:26:17

标签: go

æ¥è‡ªEffective Go

  

接收器始终阻塞,直到有数æ®è¦æŽ¥æ”¶ä¸ºæ­¢ã€‚如果通é“未缓冲,则å‘é€æ–¹å°†é˜»å¡žï¼Œç›´åˆ°æŽ¥æ”¶æ–¹æ”¶åˆ°è¯¥å€¼ã€‚

但是signal.Notify会将信å·ä¸­ç»§åˆ°æ— ç¼“冲的通é“而ä¸ä¼šé˜»å¡žã€‚这是如何工作的,是å¦å¯ä»¥ä¸Žå…¶ä»–陈< - 类型?

一起使用

2 个答案:

答案 0 :(得分:6)

当os.Notify无法阻止时,它æ„味ç€å¦‚æžœè¦é˜»æ­¢ï¼Œåˆ™ä¼šä¸¢å¼ƒæ¶ˆæ¯ã€‚因此,虽然它没有阻止它是真的,但如果它们ä¸èƒ½ç«‹å³è¢«æŽ¥æ”¶ï¼Œé‚£ä¹ˆå®ƒå°†ä¼ é€’ä¿¡å·æ˜¯ä¸æ­£ç¡®çš„。这是通过简å•çš„select:

完æˆçš„
select {
    case channel <- message:
        // message sent
    default:
        // message dropped
}

这就是Notify的文档明确指出您应该使用缓冲通é“的原因。å¦è¯·æ³¨æ„,缓冲通é“也å¯ä»¥é˜»å¡žï¼Œè€Œä¸ä»…仅是无缓冲通é“;缓冲通é“仅在缓冲区已满时阻止。

the tour和the spec涵盖

select。

答案 1 :(得分:0)

<å—引用>

这就是为什么 Notify 的文档明确指出您应该使用缓冲通é“

使用 Go 1.17,the tool vet 也会使这一点更清楚:

<å—引用>

调用信å·çš„新警告。在未缓冲的通é“上通知

df2 <- df$out3$parm$stand setDT(df2)[, flag := data.table::fcase(is.na(V8), 9L, V8 < 500, 3L, V7 > 500, 2L, default = 1L)][] V1 V2 V3 V4 V5 V6 V7 V8 flag 1: 892 332 190 481 568 836 105 414 3 2: 221 753 714 938 301 222 NA 676 1 3: 103 354 416 192 900 478 998 NA 9 4: 518 504 780 540 201 209 896 183 3 5: 603 799 576 869 187 569 905 643 2 工具现在会警告对 vet 的调用,并将传入信å·å‘é€åˆ°æ— ç¼“冲通é“。

使用无缓冲通é“å¯èƒ½ä¼šä¸¢å¤±åœ¨å…¶ä¸Šå‘é€çš„ä¿¡å·ï¼Œå› ä¸º signal.Notify 在å‘é€åˆ°é€šé“æ—¶ä¸ä¼šé˜»å¡žã€‚

例如:

signal.Notify

c := make(chan os.Signal) // signals are sent on c before the channel is read from. // This signal may be dropped as c is unbuffered. signal.Notify(c, os.Interrupt) 的用户应使用具有足够缓冲空间的信é“以跟上预期的信å·é€ŸçŽ‡ã€‚