当前位置: 首页 > wzjs >正文

滕州营销型网站游戏开发 网站开发

滕州营销型网站,游戏开发 网站开发,wordpress的登陆,二手房网站建设书协程可以让多个任务并发执行,但当多个协程需要共享数据、互相通信时,怎么保证安全呢? Go 给出的答案就是:通道(Channel)。 一、什么是通道(Channel)? 一句话总结&…

协程可以让多个任务并发执行,但当多个协程需要共享数据、互相通信时,怎么保证安全呢?

Go 给出的答案就是:通道(Channel)

一、什么是通道(Channel)?

一句话总结:通道是协程之间用来传递数据的管道。

  • 协程通过通道发送和接收数据,避免了加锁的复杂性;

  • 通道在设计上保证了并发安全;

  • 其本质就是一种阻塞队列。

二、通道的基本语法

1. 创建通道

使用 make() 函数创建通道:

ch := make(chan int)

这里创建了一个只能传递 int 类型数据的通道。

2. 发送与接收数据

ch <- 10 // 发送数据
val := <-ch // 接收数据

注意:

  • 发送操作会阻塞,直到有协程来接收;

  • 接收操作也会阻塞,直到有数据可读。

三、通道使用示例

我们用两个协程演示通道的通信:

package mainimport ("fmt"
)func sendData(ch chan int) {ch <- 100 // 向通道发送数据
}func main() {ch := make(chan int)go sendData(ch) // 启动协程val := <-ch // 从通道接收数据fmt.Println("Received:", val)
}

四、缓冲通道 vs 无缓冲通道

1. 无缓冲通道

ch := make(chan int)
  • 发送和接收必须配对;

  • 适合做同步操作;发送一个接收一个,交替使用。

2. 缓冲通道

ch := make(chan int, 3) // 缓冲区大小为3
  • 发送不会立刻阻塞,直到缓冲区满;

  • 适合临时存储任务、结果等。

    package mainimport ("fmt"
    )func main() {ch := make(chan int, 2)ch <- 1ch <- 2fmt.Println(<-ch) // 1fmt.Println(<-ch) // 2
    }
    

    五、使用 select 实现多路复用

    select 语句可以同时监听多个通道,谁先准备好就处理谁:

    package mainimport ("fmt""time"
    )func sendData(ch chan int, data int) {ch <- data // 向通道发送数据
    }func main() {ch1 := make(chan int)ch2 := make(chan int)go sendData(ch1, 100)go sendData(ch2, 200)var forBreak = falsefor {select {case data := <-ch1:fmt.Println("Received from ch1:", data)case data := <-ch2:fmt.Println("Received from ch2:", data)case <-time.After(time.Second):fmt.Println("程序超时退出")forBreak = true}if forBreak {break}}fmt.Println("程序结束")
    }
    

    六、通道关闭与遍历

    1. 关闭通道

    通道使用完毕后可关闭:

    close(ch)
    
  • 关闭后无法再发送数据;

  • 关闭后的通道仍可接收数据,直到取完为止;

  • 不关闭通道不会内存泄漏,除非有消费者在等待数据。

     2. 遍历通道

配合 range 使用,通道关闭后遍历数据:

package mainimport ("fmt""sync"
)var waitGroup sync.WaitGroupfunc sendData(ch chan int, data int) {ch <- data // 向通道发送数据waitGroup.Done()
}func main() {ch1 := make(chan int, 3)waitGroup.Add(3)for i := 1; i <= 3; i++ {go sendData(ch1, i)}waitGroup.Wait()close(ch1)for data := range ch1 {fmt.Printf("读取通道信息:%d\n", data)}fmt.Println("程序结束")
}

 通道遍历阻塞,直到通道关闭:

package mainimport ("fmt""sync"
)var waitGroup sync.WaitGroupfunc sendData(ch chan int, data int) {ch <- data // 向通道发送数据waitGroup.Done()
}func waitClose(ch1 chan int) {fmt.Println("等待协程完成后,关闭通道")waitGroup.Wait()close(ch1)
}func main() {ch1 := make(chan int, 3)waitGroup.Add(3)for i := 1; i <= 3; i++ {go sendData(ch1, i)}go waitClose(ch1)for data := range ch1 {fmt.Printf("读取通道信息:%d\n", data)}fmt.Println("程序结束")
}

     七、完整示例:协程+通道实现任务传递

package mainimport ("fmt""sync"
)func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {defer wg.Done()for job := range jobs {fmt.Printf("Worker %d processing job %d\n", id, job)}
}func main() {jobs := make(chan int, 5)var wg sync.WaitGroup// 启动3个worker协程for w := 1; w <= 3; w++ {wg.Add(1)go worker(w, jobs, &wg)}// 发送5个任务for j := 1; j <= 5; j++ {jobs <- j}close(jobs)wg.Wait()
}


文章转载自:

http://iKoNIoR2.qxgmp.cn
http://iACUeBfK.qxgmp.cn
http://YW1g2a2J.qxgmp.cn
http://WiVFwROh.qxgmp.cn
http://0QbDTJTI.qxgmp.cn
http://zvBkd6PG.qxgmp.cn
http://KrhPZs8N.qxgmp.cn
http://zgrz2IS3.qxgmp.cn
http://VHa1jYBG.qxgmp.cn
http://VTk6nsxB.qxgmp.cn
http://hKhYNG8a.qxgmp.cn
http://tbo7UsKm.qxgmp.cn
http://2BtzzNQO.qxgmp.cn
http://tlVVT8Az.qxgmp.cn
http://SOLuSFyf.qxgmp.cn
http://IEMhk7e4.qxgmp.cn
http://22tbhfFn.qxgmp.cn
http://7dpk1t7V.qxgmp.cn
http://zURYYfDn.qxgmp.cn
http://V76pw9aJ.qxgmp.cn
http://ccEAiKdb.qxgmp.cn
http://sjCT7r6z.qxgmp.cn
http://K1SUgimL.qxgmp.cn
http://zjgLoE5v.qxgmp.cn
http://JUIH4OmK.qxgmp.cn
http://7uKORqlG.qxgmp.cn
http://0plD8Dyl.qxgmp.cn
http://wUb6TaUc.qxgmp.cn
http://XznvjYx4.qxgmp.cn
http://LdeHvhqZ.qxgmp.cn
http://www.dtcms.com/wzjs/682267.html

相关文章:

  • 台州网站建站公司廊坊网站建设官网
  • 上传网站空间上海手机网站制作
  • 企业建站系统是什么网站专题报道怎么做
  • 谷歌网站推广排名工具wordpress 后台登陆 修改
  • 网站建设中什么意思9 1短视频安装
  • 东莞市塘厦网站建设壹网
  • 求跳转代码来自百度等搜索引擎访问跳转到另一个网站直接输入域名如何在网站做旅游产品
  • 潍坊网站建设方案推广宁波seo优化外包公司
  • 郑州网站建设 股权投资学院网站建设投标
  • 网站推广方式关键词优化排名易下拉稳定
  • 昆明做网站设计谷秋精品课程网站建设软件
  • 网站续费开发门户网站
  • 泰安网站建设哪家快深圳公司开发网站
  • 做网站需要什么技能西安 医疗网站建设
  • 做平面什么网站好用龙岩招聘网最新招聘在龙岩的工作
  • 上海建站提供商怎么样建设网站网站
  • 盐城建站江西网站开发软件公司
  • vpn网站模板wordpress 分类信息主题
  • 本地镇江网站建设长沙设计网站多少钱
  • 网站安全建设管理制度会展网站代码源码
  • 什么是网站设计在网站上做送餐外卖需要哪些资质
  • 金融棋牌网站建设wordpress 页面模板 自定义
  • 做商城型网站汕头网页制作
  • 钟落潭有没有做网站的云南品牌网站开发
  • 网站建设设计主要系统网站建设这个职业是什么
  • 用wordpress做站群深圳网站建设服务什么便宜
  • 西宁市建设网站多少钱高端品牌网站建设九五网络
  • 温州制作企业网站厦门人才网唯一官网登录
  • wordpress建站教程视频做儿童文学有哪些的网站
  • 企业网站建设范文淘宝网页版登陆