>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
Go

Go 并发实战:边做边学,而非仅仅阅读!

身に覚えがありませんか? Go の并发についての記事や本を開き、読み始めますが、途中で理論と実践は完全不同だということに気づきます。Goroutine、チャンネル、ミューテックス、WaitGroup はすべて論理的に聞こえますが、実際のタスクに遭遇し、特に正しいコードを書こうと考えると話は別です。

正因为如此,由 Long Hoang 创建的优秀的 go-concurrency-exercises リポジトリが存在します。これは単なる問題集ではなく、読むのではなく実践することを強制するインタラクティブなトレーナーです。そして私の考えでは、Go での并发の動作を真に理解するための最も効果的な方法です。

Excited gopher image

なぜすべての Go 開発者に必要なのか

プロジェクト作者の loong は非常に正確な観察をしています:Go の并发に関するリソースはたくさんありますが、誰真的にすべてを読みたいですか?私は完全に同意します!私たちの脳は、実体験を通じて情報を処理るときに最もよく記憶するようにできています。このプロジェクトはまさに「行動による学習」というアプローチを提供します。

想像してみてください:プロデューサー・コンシューマーパターンを単に読むのではなく、自分で実装し、落とし穴に遭遇し、バグを修正し、コードが生きて動作するのを見ます。それはどんな理論も置き換えられない貴重な経験です。

「トレーナー」の仕組み

非常简单而且直观。每个「挑战」都是一个单独的文件夹,包含已经具备代码框架的任务,最重要的是还有测试!是的,验证解决方案正确性的测试。它就像一位个人导师,总是在你偏离正确道路时把你拉回正轨。

以下是作者建议的主要规则:

  • 只修改 main.go这是一个关键约束。你会得到一个项目骨架,你的工作是将你的逻辑插入到一个文件中,而不触碰其他文件。这会约束你,帮助你专注于解决特定的并发问题。
  • 使用 go test写完解决方案后,只需在任务文件夹中运行 go test。如果测试通过——恭喜,你成功了!如果没通过——那就需要更深入地研究问题并找到 bug。这类似于 TDD 方法,但用于学习目的。
  • 不要害怕寻求帮助:如果你卡住了,作者建议加入 DiscordSlack 上的 Go 社区。总有人愿意帮助代码审查或提供有价值的建议。在支持性环境中学习是很棒的。

深入任务:等待你的是什么?

该仓库包含模拟真实世界开发者场景的任务。让我们看看其中一些:

0. 限制你的爬虫

想象一下,你正在编写一个需要收集数据但不应该使目标服务器过载的 Web 爬虫。在这里,你需要实现一种限制并发请求数量的机制。这是一个掌握与速率限制和负载管理相关的模式的好任务,使用通道和 sync.WaitGroup

1. 生产者-消费者

经典!生产者-消费者模式无处不在——从消息队列处理到数据流工作。在这里,你将学习有效地使用缓冲通道来协调生成数据的 goroutine 和处理数据的 goroutine 之间的工作。在这里,你会遇到需要正确关闭通道和处理终止信号的情况。

2. 缓存中的竞态条件

哦,那些竞态!并发编程中最棘手的问题之一。在这个任务中,你需要在缓存场景中找到并修复竞态条件。这是一个使用互斥锁(sync.MutexRWMutex并学习保护共享资源免受可能导致不可预测结果的并发访问的好机会。

3. 为免费层用户限制服务时间

你如何给免费层用户有限的时间来完成操作?这个任务会让你思考超时截止时间。你将使用 context.WithTimeouttime.After 来自动中断花费太长时间的操作。这是构建容错系统非常有用的技能。

4. 优雅的 SIGINT 终止

你的应用应该在收到 SIGINT 信号时能够优雅地关闭(例如,当按下 Ctrl+C 时)。这听起来并不简单,特别是当有活跃的 goroutine 时。这个任务会教你拦截系统信号并使用context.WithCancel或通道来平稳地停止所有后台进程、关闭连接并保存数据,避免信息丢失和挂起。

5. 清理不活跃的会话以防止内存溢出

想象一下,你正在管理用户会话,需要定期删除不活跃的会话来避免内存泄漏。这个任务需要实现一个后台 goroutine,定期检查和清理旧的会话。在这里,你会遇到使用定时器(time.NewTicker的工作,以及安全访问共享数据和防止 goroutine 泄漏的需要。

谁将从这个仓库中获益最多?

  • Go 初学者:如果你刚开始学习 Go 并想快速掌握并发,这个仓库是你的好朋友。它会给你坚实的基础和实践经验。
  • 想要刷新知识的开发者:即使你写 Go 已经很久了,但感觉某些并发模式「模糊」——这是系统化和深化知识的好方法。
  • 准备面试的人:这些任务与技术上经常出现的问题非常相似。通过练习,你会感到更加自信。
  • 「做中学」的爱好者:如果你不喜欢阅读长文本,更喜欢直接跳入代码——这个项目就是为你准备的。

结论:值得一试吗?

当然,值得!go-concurrency-exercises 不仅仅是一组练习,而是一个关于 Go 并发编程的完整交互式课程。它教你不仅写代码,而且思考并行性、预见问题并构建可靠的系统。

作者提供了如此有价值的资源,做了巨大的工作。MIT 许可证 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 只会强调开放性和分享知识的愿望。所以不要浪费时间,克隆仓库,开始你的并发 Go 掌握之旅!

并发冒险中好运!

関連プロジェクト