golang中的共享内存和管道

        在golang中,我们推荐用管道进行协程间的通信而不是用共享内存,什么叫用共享内存进行协程间的通信呢?看下列代码

func do(b *int) {
   for true {
      if *b == 1 {
         fmt.Println("hello")
         break
      }
   }
}
func main() {
   b := 0
   go do(&b)
   time.Sleep(time.Second)
   b = 1
   time.Sleep(time.Second)
}        

        上述代码就是通过共享内存进行协程间的通信。而下述代码就是通过管道进行协程间的通信

func do(b chan int) {
      if <-b == 1 {
         fmt.Println("hello")
      }
}
func main() {
   b := make(chan int)
   go do(b)
   time.Sleep(time.Second)
   b <- 1
   time.Sleep(time.Second)
}

        为什么要用管道呢?那是因为当管道中读取不到数据的时候,协程它会自动进入休眠,当有数据进来他才会被唤醒,不会一直占用内存,不像共用内存那样会一直阻塞导致占用内存。并且他们能做到同样的效果,而效率却不一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
协程是轻量级的线程,可以在同一个程序并发地执行多个任务。通过使用协程,我们可以更有效地利用计算资源并实现并发编程。而管道是用于在协程之间传递数据的通信机制。在Go语言,我们可以使用管道来实现协程之间的同步和通信。 在Go语言,我们可以通过以下步骤来使用协程和管道: 1. 使用关键字"go"来创建一个协程,让其并发执行一个函数或方法。 2. 使用"make"函数来创建一个管道,并指定其元素类型和容量。管道可以是有缓冲的(指定了容量)或者无缓冲的(未指定容量)。 3. 在协程,使用"<-"操作符将数据发送到管道,或者从管道接收数据。 4. 如果管道是无缓冲的,发送操作和接收操作会导致发送方和接收方都会阻塞,直到对应的操作完成。这种情况下,协程之间的通信是同步的。 5. 如果管道是有缓冲的,发送操作只有在管道已满时才会阻塞,接收操作只有在管道为空时才会阻塞。这种情况下,协程之间的通信是异步的。 下面是一个示例代码来演示协程和管道的使用: ```go package main import ( "fmt" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "processing job", j) results <- j * 2 } } func main() { jobs := make(chan int, 5) results := make(chan int, 5) // 创建3个协程来并发执行任务 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送5个任务到管道 for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 从结果管道接收并打印结果 for r := 1; r <= 5; r++ { fmt.Println(<-results) } } ``` 在这个示例,我们创建了一个有缓冲的"jobs"管道和一个有缓冲的"results"管道。然后,我们创建了3个协程来并发执行任务。每个协程从"jobs"管道接收任务,处理任务后将结果发送到"results"管道。最后,主函数从"results"管道接收并打印结果。 希望这个示例能够帮助你理解如何在Go语言使用协程和管道

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值