go goroutine channel 和C# Task BlockingCollection 以及python该如何实现

本文将goroutine与C#的Task进行对比,两者均可视为逻辑线程,多对多对应底层物理线程。文章讨论了go的channel和C#的BlockingCollection在多线程通信中的作用,特别是同步通信。通过接力赛的例子,展示了如何使用无缓冲的channel在goroutine间同步数据。同时,文章提供了Python中实现线程安全且带阻塞功能的队列threadSafeQueue.py的代码示例,并展示其与C#、Go相同的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说结论吧,个人感觉go的goroutine 和C# 的Task 相似,goroutine 和Task 可以近似理解为逻辑线程, 至于多个goroutine 或Task 对应操作系统几个物理线程 是底层决定的,我们可以不用太关心;但是一定是多对多【这个我们可以简单理解多对一, 一个或多个goroutine 或Task 对应底层一个物理线程】, 具体的blockingcollection可以参考 https://blog.csdn.net/ma_jiang/article/details/54561684, go channel 可以参考https://blog.csdn.net/ma_jiang/article/details/84497607

channel 和BlockingCollection 可以再多线程之间通信,尤其是在同步通信 都是运用它们阻塞的特定来做了。比如常见的接力赛: 使用无缓冲的通道,在 goroutine 之间同步数据,来模拟接力比赛。在接力比赛里,4 个跑步者围绕赛道轮流跑。第二个、第三个和第四个跑步者要接到前一位跑步者的接力棒后才能起跑。比赛中最重要的部分是要传递接力棒,要求同步传递。在同步接力棒的时候,参与接力的两个跑步者必须在同一时刻准备好交接。

go的代码:

package main

import (
	"fmt"
	"sync"
	"time"
)

// wg 用来等待程序结束
var wg sync.WaitGroup

// main 是所有Go 程序的入口
func main() {
	// 创建一个无缓冲的通道
	baton := make(chan int)
	// 为最后一位跑步者将计数加1
	wg.Add(1)
	// 第一位跑步者持有接力棒
	go Runner(baton)
	// 开始比赛
	baton <- 1
	// 等待
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值