Goroutines (一)

Goroutines

CSP communicating sequential processes

Go 语言中,每一个并发执行单元叫做一个goroutine,语法上仅需要在一个普通函数或方法调用前加上关键字go。

f() //正常调用

go f() //开启一个goroutine

一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。

ch := make(chan int) // ch has type 'chan int'

ch = make(chan int, 0) // unbuffered channel
ch = make(chan int, 3) // buffered channel with capacity 3

和map类似,channel也对应一个make创建的底层数据结构的引用

当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。
两个相同类型的channel可以使用==运算符比较。如果两个channel引用的是相同的对象,那么比较的结果为真。一个channel也可以和nil进行比较。

ch <- x a send statement receive expression in an assignment <-ch statement; result is discarded < code></->

Channel支持close操作,用于关闭channel,随后对基于该channel的任何发送操作都将导致panic异常。一个已经被close过的channel进行接收操作依然可以接受到之前已经成功发送的数据;如果channel中已经没有数据的话将产生一个零值的数据。

关闭一个channel

close(ch)

一个基于无缓存Channel的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channel上执行接收操作,当发送的值通过Channels成功传输之后,两个goroutine可以继续执行后面的语句。反之,如果接收操作先发生,那么接收者goroutine也将阻塞,直到有另一个goroutine在相同的Channels上执行发送操作。

基于无缓存Channels的发送和接收操作将导致两个goroutine做一次同步操作,因此,无缓存的Channel 也被称为同步Channel ,当通过一个无缓存Channel发送数据时,接收者收到数据发生在再次唤醒发送者goroutine之前(happens before)

消息事件 利用channel进行通信,通知另一个协程事情已经做完

func main() {
    var i = 0
    done := make(chan struct{})
    go func() {
        for i < 10 {
            fmt.Printf("i = %d\n", i)
            i++
            if i == 10 {
                fmt.Printf("done\n")
                done <- struct{}{} } time.sleep(100 * time.millisecond) }() <-done < code></->

一个Channel的输出作为下一个Channel的输入,当一个channel被关闭后,再向该channel发送数据将导致panic异常。当一个被关闭的channel中已经发送的数据都被成功接收后,后续的接收操作将不再阻塞,它们会立即返回一个零值。

func main() {
    naturals := make(chan int)
    squares := make(chan int)

    // Counter
    go func() {
        for x := 0; ; x++ {
            if x < 100 {
                naturals <- x } else { close(naturals) break 这里需要break 重复关闭一个channel将导致panic异常 }() squarer go func() for :="<-naturals" squares <- * printer (in main goroutine) fmt.println(<-squares) 程序会无休止的收到0值 < code></->

channel 接收的方式可以改进

&#x5229;&#x7528;&#x7B2C;&#x4E8C;&#x4E2A;&#x8FD4;&#x56DE;&#x503C;&#x5224;&#x65AD; channel &#x662F;&#x5426;&#x5173;&#x95ED;
go func() {
    for {
        x, ok := <-naturals if !ok { break } squares <- x * close(squares) }() l利用for range 形式 for :="range" fmt.println(x) < code></-naturals>

试图重复关闭一个channel将导致panic异常,试图关闭一个nil值的channel也将导致panic异常。关闭一个channels还会触发一个广播机制

类型chan

Original: https://www.cnblogs.com/arvinhuang/p/15220515.html
Author: 平凡键客
Title: Goroutines (一)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620175/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL启动过程详解二:核心模块启动 init_server_components()

    mysqld_main() 函数中,init_server_components() 函数负责MySQL核心模块的启动,包括mdl系统,Innodb存储引擎的启动等等: mdl子系…

    数据库 2023年6月9日
    0100
  • Tomcat端口占用

    进入命令行命令:netstat -ano作用:查看所有端口占用 命令:netstat -aon|findstr 端口号port作用:查看端口号port占用情况 命令:taskkil…

    数据库 2023年6月11日
    075
  • AI听曲识歌!哼曲、口哨吹,都能秒识! ⛵

    💡 作者:韩信子@ShowMeAI📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42📘 自然语言处理实战系列:https://www…

    数据库 2023年6月14日
    0127
  • 事物的隔离性和MVCC

    事物的隔离性 mysql的服务端是支持多个客户端同时与之连接的,每个客户端可能还并发了好几个连接,所以mysql是需要同时处理很多事情的,每一件独立的事情就叫做事务。我们知道事务有…

    数据库 2023年6月14日
    097
  • pg 锁表

    select * from pg_catalog.pg_stat_activity where usename =’gis_bd_app’ and wait…

    数据库 2023年6月6日
    0122
  • 优雅的代码从现在开始

    个人见解: 写代码前 构思明白, 想明白,想全 写着写着都是在写相同的代码,改动麻烦 看到不好的就立马让他优雅 学习别人是如何优雅的 便于维护,避免重复代码,便于开发 提取公共函数…

    数据库 2023年6月11日
    0105
  • Cannot execute statement in a READ ONLY transaction.

    报错如下: Cause: java.sql.SQLException: Cannot execute statement in a READ ONLY transaction. ;…

    数据库 2023年6月11日
    0108
  • MRCTF2020 pyFlag

    可以看到在zip文件头和jpg文件尾中有提示这是秘密文件的part1,那么思路就打开了,将其他图片的秘密文件部分拼成一个文件即可。 全部合起来组成一个zip文件,不是伪加密,先爆破…

    数据库 2023年6月11日
    0101
  • Ansible简介

    Ansible 是一种常用的自动运维化工具,基于 python 开发,分布式,无需客户端,轻量级,配置语言采用 YAML。 模块化:调用特定的模块,完成特殊的任务。 2.Param…

    数据库 2023年6月14日
    0130
  • Docker安装部署Mysql8(以作数据持久化)

    1.创建容器并进行持久化处理 #拉取镜像 docker pull mysql:8.0.20 #启动镜像,用于拷贝配置文件到宿主机 docker run -p 3306:3306 -…

    数据库 2023年6月11日
    0124
  • 2022年5月数据库排名

    数据来源:https://db-engines.com/en/ranking Original: https://www.cnblogs.com/chujian007/p/1631…

    数据库 2023年6月11日
    088
  • window server2019+vmware16+Ubuntu20部署网站记录

    准备: 1:物理机一台,我的配置如下: 2:U盘10G以上一个,系统启动盘制作使用 3:Windows Server2019系统镜像 3-1:我下载的是server2019版本系统…

    数据库 2023年6月6日
    0102
  • mysql约束

    一、表约束 PK主键约束(索引)唯一约束 非空 默认值 在关系数据库,一个表中,只能有一个主键(Primary Key),有些数据库没有pk,系统报出错误。 在myql数据库,建立…

    数据库 2023年6月9日
    093
  • 【黄啊码】MySQL入门—3、我用select *,老板直接赶我坐火车回家去,买的还是站票

    大家好!我是黄啊码,学会了DDL语句了吗?那我们今天就来学习一下基本的查询语法,我见过很多外包机构的程序员都是万物皆可select *,然后项目跑了一段时间就基本跑不动了,问就回答…

    数据库 2023年6月16日
    069
  • 一篇文章带你掌握主流数据库框架——MyBatis

    一篇文章带你掌握主流数据库框架——MyBatis MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 在之前的文章中我们学习了MYSQL和JDBC…

    数据库 2023年6月14日
    0123
  • zabbix自定义监控进程和日志

    自定义监控 进程 日志 mysql主从状态 mysql主从延迟 自定义监控 进程 [root@client ~]# cd /usr/local/etc/ [root@client …

    数据库 2023年6月14日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球