本文作者:icy

Golang-并发协程基础-goroutine[小小例子]

icy 2021-02-23 536 抢沙发
Golang-并发协程基础-goroutine[小小例子]摘要: 在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和CPU 数量间建立一个对应关系,以保证每个任务能及时地...

在编写 Socket 网络程序时,
需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和
CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,
同时避免多个任务频繁地在线程间切换执行而损失效率。

虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,
线程池就不是非常直观和方便了。能否有一种机制:使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,
让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine。

goroutine 是 Go语言中的轻量级线程实现,
由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。

Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。
使用普通函数创建 goroutine
Go 程序中使用 go 关键字为一个函数创建一个 goroutine。一个函数可以被创建多个 goroutine,
一个 goroutine 必定对应一个函数。

协程也就是微线程 ,go语言搞并发一个很重要的东西
下面是自己以前练习的时候的小例子

package main

import (
    "fmt"
    "time"
)

func  doSay(id int) {
   i := 0
   for {
          i++
          fmt.Printf("协程ID = %d 执行次数 = %d\n",id,i)
          time.Sleep(time.Second)
   }
}

func main(){

    fmt.Println("主线程执行....")

    go doSay(1)
    go doSay(2)
    go doSay(3)

    for i:= 0; i < 10; i++ {
        fmt.Println("主线程执行次数 = ",i)
        time.Sleep(time.Second)
    }
}

下面是运行结果

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,536人围观)参与讨论

还没有评论,来说两句吧...