Go语言实现并发(协程)

用go命令来执行协程

普通程序

package main

import "fmt"
import "time"

func go_worker(name string){
	for i:=0; i<5; i++{
		fmt.Println("我是一个go协程,我的名字是 ",name)
		time.Sleep(1 * time.Second)
	}
	fmt.Println(name,"执行完毕")
}

func main(){
	go_worker("小黑")

}

 

用协程执行

package main

import "fmt"
import "time"

func go_worker(name string){
	for i:=0; i<5; i++{
		fmt.Println("我是一个go协程,我的名字是 ",name)
		time.Sleep(1 * time.Second)
	}
	fmt.Println(name,"执行完毕")
}

func main(){
	//开辟一个go协程
	go go_worker("小黑")
	//开辟一个go协程
	go go_worker("小白")

	for i:=0; i<10; i++{
		fmt.Println("我是main")
		time.Sleep(1 * time.Second)
	}
}

 

channel实现协程通信

 

      c := make(chan int)

你想传递整型就int,想传递字符串就string

package main

import "fmt"

func worker(c chan int) {
	//从channel c中得到数据
	num := <-c
	fmt.Println("得到了管道中的数据 ", num)
}

func main() {
	//创建⼀个channel
	c := make(chan int)
	
	//开辟一个协程,去执行worker函数
	go worker(c)

	//main向channel c中写数据
	c <- 1

	fmt.Println("我是main")
}

 

等待组sync.WaitGroup

       多线程编程中,经常会遇到这样的一种场景:main函数中为了等待其他线程执行完,在return之前都要执行sleep以争取更多的时间给其他线程执行.

      主线程为了等待goroutine都运行完毕,不得不在程序的末尾使用time.Sleep() 来睡眠一段时间,等待其他线程充分运行。对于简单的代码,100个for循环可以在1秒之内运行完毕,time.Sleep() 也可以达到想要的效果。但是对于实际场景来说,大多无法预知for循环内代码运行时间的长短,因此1秒可能是不够的。所以睡眠也就达不到我们想要的效果。

 

      WaitGroup(等待组)就是用来解决这种问题的,它主要用于同步多个协程间的状态(例如等待所有协程都执行完)。

      在WaitGroup 对象实现中,内部有一个计数器,最初从0开始,它有三个方法:

  • Add():计数器加一
  • Done():计数器减一
  • Wait():等待计数器清零

 

执行Wait方法的函数在等待组内部计数器不为0的时候回阻塞,一旦计数器为0了,程序就会继续往下执行。

 

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 程是一种用于编写并发程序的技术。在 Go 中,程是通过使用关键字 `go` 来实现的。 例如,下面的代码创建了一个程,该程会打印 "hello, world": ``` package main import "fmt" func main() { go fmt.Println("hello, world") } ``` 当执行这段代码时,程会在后台执行,并且会在 main 函数执行完毕之前打印 "hello, world"。 程可以被用来实现并发编程,因为它们可以在同一个程序中并发地运行。这使得程很适合用来执行计算密集型任务或网络 I/O 操作。 程也可以使用信道(channel)来进行通信。信道可以用来在程之间传递数据,并且可以被用来同步程的执行。 有关 Go程的更多信息,你可以参考 Go 的官方文档:https://tour.golang.org/concurrency/1 ### 回答2: Go语言中的程(goroutine)是一种轻量级的线程实现方式。与传统的操作系统线程相比,程的启动、切换和销毁的开销更小,可以同时运行成千上万个程。 Go语言程是通过go关键字来创建的。使用go关键字可以在函数前面加上go,将该函数的执行放在一个新的程中运行。例如: ``` func foo() { fmt.Println("Hello, World!") } func main() { go foo() time.Sleep(time.Second) } ``` 这段代码中,main函数中的go foo()语句创建了一个新的程来执行foo函数。程的具体执行时机是由Go运行时(Go runtime)来决定的。 Go语言程使用了一种称为M:N调度的模型,即将M个程(或者说用户态线程)映射到N个操作系统线程上运行。Go运行时会根据系统负载情况动态地创建或销毁操作系统线程,保持程的高效运行。 在程的执行过程中,当遇到阻塞操作(比如网络请求、文件IO等)时,Go运行时会自动将该程挂起,并将其切换到其它可以运行的程上,以提高整体的并发效率。当阻塞操作完成后,该程会被重新唤醒,继续执行。 由于Go语言程具有轻量级、低开销的特点,因此非常适合用于构建高并发的网络服务、并行计算等场景。同时,Go语言程也允许通过通道(channel)进行程之间的通信,以实现程之间的同步与数据共享。 总的来说,Go语言中的程通过go关键字创建,采用M:N调度模型,在执行过程中自动进行切换,提供了一种高效的并发编程方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值