{"id":17955661,"url":"https://github.com/smallnest/channels","last_synced_at":"2025-09-05T22:33:21.702Z","repository":{"id":57529141,"uuid":"126318556","full_name":"smallnest/channels","owner":"smallnest","description":"go channel patterns","archived":false,"fork":false,"pushed_at":"2019-04-22T00:55:55.000Z","size":12,"stargazers_count":91,"open_issues_count":0,"forks_count":19,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-19T06:42:45.627Z","etag":null,"topics":["channel","channels","go","golang","patterns"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smallnest.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-22T10:28:44.000Z","updated_at":"2024-10-16T17:58:48.000Z","dependencies_parsed_at":"2022-09-26T18:11:50.292Z","dependency_job_id":null,"html_url":"https://github.com/smallnest/channels","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallnest%2Fchannels","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallnest%2Fchannels/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallnest%2Fchannels/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smallnest%2Fchannels/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smallnest","download_url":"https://codeload.github.com/smallnest/channels/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245385301,"owners_count":20606642,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["channel","channels","go","golang","patterns"],"created_at":"2024-10-29T10:31:38.396Z","updated_at":"2025-03-25T02:30:52.834Z","avatar_url":"https://github.com/smallnest.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Channel 应用模式\n\n\n\n## Lock/TryLock模式\n\n### 最高效的TryLock\n\n[trylock]()\n\n### 使用Channel实现TryLock\n\n[trylock_channel]()\n\n### 使用Channel实现Timeout功能的TryLock\n\n[trylock_timeout]()\n\n## or 信号模式\n从多个channel读取一个信号, 一旦读取到一个信号，则不再读取。\n\n比如向多个服务器发送相同的http request,每个请求的结果放在单独的一个channel中， 只要其中一个服务器返回结果，则其它请求就被忽略。\n\n### or channel by  goroutine\n\n[or_channel_go]()\n\n最简单的方式就是为每个channel启动一个goroutine, 每个goroutine读取自己负责的channel，一旦读取到一个信号，就关闭返回的channel。\n显然，为每个channel启动一个goroutine太浪费了，虽然goroutine是一种轻量级的实现，但是如果数量巨大的情况下也会导致资源的大量占用以及调度上的性能低下。\n\n\n### or channel (递归)\n\n[or_channel]()\n基于递归的方式实现， 使用依次递归的方式\n\n### or channel (递归)\n\n[or_channel_rec]()\n基于递归的方式实现, 使用分而治之的方式\n\n### or channel reflect\n\n[or_channel_rec]()\n基于反射的方式\n\n## or_done_channel模式\n\n与上面的or 信号模式不同， `or done channel`模式是从一个channel中读取数据，只有当channel被关闭，或者done 信号channel被关闭的时候，读取操作才退出。\n\n[or_done_channel]()\n\n如果将`done`这个信号channel换成 `context`,则可以依靠 `context.WithCancel` 来cancel读取，和这个模式类似。\n\n## flat 模式\n\n[flat]()\n将多个channels平展成一个channels。 与`Fan In`不同的是，输入的channels是从一个channel中读取出来的，而`Fan In`模式中的channels是一个channel slice。\n\n## map/reduce 模式\n\n[mapreduce]()\n\n\n## Fan In 扇入模式\n\n将多个channel合并成一个channel\n\n[fanIn]()\n\n## Fan Out 扇出模式\n\n将一个Channel分成多个Channel。 有两种情况， 一种是每个channel都包含同样的数据(复制模式)， 另一种将原数据均匀分布到各输出channel中(分布模式)\n\n- 复制模式\n  - [fanOut]()\n  - [fanOutReflect]()\n- 分布模式\n  - [fanOut]()\n  - [fanOutReflect]()\n\n## References\n1. https://github.com/kat-co/concurrency-in-go-src\n2. https://github.com/campoy/justforfunc/tree/master/27-merging-chans\n3. https://github.com/eapache/channels\n4. https://github.com/LK4D4/trylock\n5. https://github.com/lrita/gosync","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallnest%2Fchannels","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmallnest%2Fchannels","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmallnest%2Fchannels/lists"}