diff --git a/README.md b/README.md index 33e2be3..c610b15 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Go tips from [Phuong Le](https://twitter.com/func25). | 67 | How to deal with long function signatures | richzw | | 68 | Use the deadcode tool to find and remove unused functions | richzw | | 69 | Manage multiple goroutines with errgroup | richzw | -| 70 | | | +| 70 | Implement a context-aware sleep function | hxzhouh | | 71 | sync.Pool, make it typed-safe with generics | QingyaFan | | 72 | | | | 73 | Implement String() for enum with the stringer tool | syjs10 | diff --git a/src/070.md b/src/070.md new file mode 100644 index 0000000..ffd0404 --- /dev/null +++ b/src/070.md @@ -0,0 +1,40 @@ +# Tip #70 实现一个感知context的sleep 函数 + +> 原始链接: [Golang Tip #70: Implement a context-aware sleep function.](https://twitter.com/func25/status/1776936187137229071) + +**常规 time.Sleep ()不关心`context`。如果您将其设置为暂停 5 分钟,无论如何,它都会暂停整个过程.** + +即使我们尝试在`context`中使用它,就像下面的例子一样,它也要等到 10 秒后才会停止: + +![tips-070-img1](./images/070/tips070-img1.png) + +> 我们在Tips #63 中讨论了解决方案:[避免 time.Sleep ()](https://twitter.com/func25/status/1774070336214253734) + +我们之前讨论的解决方案是可行的,但是一遍又一遍地写就有点麻烦了。 + +因此,让我们制作一个更加用户友好的版本,仍然让我们使用 Sleep() 函数,但尊重`context`被取消的时间。 +我们可以创建一个“假”睡眠函数,如果`context`告诉它停止,它就会停止: + +![tips070-img3](./images/070/tips070-img2.png) + +https://go.dev/play/p/FErMIDKoulb + +这样,我们可以在 Go 中暂停代码,但如果有东西告诉`context`停止,Sleep将提前结束: + +![](./images/070/tips070-img3.png) + +>“等等,你为什么不处理sleep()的错误呢?” + +嗯,我们通常不需要。 + +大多数时候,当`context`被取消时,与sleep功能无关。这通常是因为程序中有一个更大的问题,其中包括sleep部分。 + +例如,如果代码中`sleep()`之后有步骤,并且它们被设置为监听上下文,那么如果`context`被取消,它们也会停止。 + +因此,让我们的sleep时间更短更加重要。 + +![tips070-img1](./images/070/tips070-img4.png) + +--- + +译者注: 评论区里面提到了一个 stackoverflow 的讨论,[How can I sleep with responsive context cancelation?](https://stackoverflow.com/questions/55135239/how-can-i-sleep-with-responsive-context-cancelation/77415571#77415571) 感兴趣的朋友可以看看。 diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 7c3257f..f076127 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -28,6 +28,7 @@ - [Tip #67 如何处理长函数签名](./067.md) - [Tip #68 使用deadcode工具来找到和删除无用的函数](./068.md) - [Tip #69 通过errgrup管理多个goroutine](./069.md) +- [Tip #70 实现一个感知context的sleep 函数](./070.md) - [Tip #73 用stringer工具给枚举类型实现String()方法](./073.md) - [Tip #74 使 time.Duration 清晰易懂](./074.md) - [Tip #75 使用singleflight优化多次调用](./075.md) diff --git a/src/images/070/tips070-img1.png b/src/images/070/tips070-img1.png new file mode 100644 index 0000000..869ce6f Binary files /dev/null and b/src/images/070/tips070-img1.png differ diff --git a/src/images/070/tips070-img2.png b/src/images/070/tips070-img2.png new file mode 100644 index 0000000..be10703 Binary files /dev/null and b/src/images/070/tips070-img2.png differ diff --git a/src/images/070/tips070-img3.png b/src/images/070/tips070-img3.png new file mode 100644 index 0000000..ffef50c Binary files /dev/null and b/src/images/070/tips070-img3.png differ diff --git a/src/images/070/tips070-img4.png b/src/images/070/tips070-img4.png new file mode 100644 index 0000000..e53f72e Binary files /dev/null and b/src/images/070/tips070-img4.png differ