ToB企服应用市场:ToB评测及商务社交产业平台

标题: golang 并发 [打印本页]

作者: 西河刘卡车医    时间: 2024-3-24 13:48
标题: golang 并发
Golang 并发

Golang 并发优势

Goroutine 是什么

创建goroutine

  1.     package main
  2.     import (
  3.     "fmt"
  4.     "time"
  5.     )
  6.     //测试协程
  7.     //循环打印内容
  8.     func newTask() {
  9.     i := 0
  10.     for {
  11.     i++
  12.     fmt.Printf("new goroutine\:i=%d\n", i)
  13.     time.Sleep(1 \* time.Second)
  14.     }
  15.     }
  16.     //main()相当于是主协程
  17.     func main() {
  18.     //启动子协程
  19.     go newTask()
  20.     i := 0
  21.     for {
  22.     i++
  23.     fmt.Printf("main goroutine\:i=%d\n", i)
  24.     time.Sleep(1 \* time.Second)
  25.     }
  26.     }
复制代码
  1.     package main
  2.     import (
  3.     "fmt"
  4.     "time"
  5.     )
  6.     //main()相当于是主协程
  7.     func main() {
  8.     //匿名子协程
  9.     go func() {
  10.       i := 0
  11.       for {
  12.         i++
  13.         fmt.Println("子协程 i=", i)
  14.         time.Sleep(1 \* time.Second)
  15.       }
  16.     }()
  17.     i := 0
  18.     for {
  19.       i++
  20.       fmt.Println("主协程 i=", i)
  21.       time.Sleep(1 \* time.Second)
  22.       //主协程第二次后退出
  23.       if i == 2 {
  24.         break
  25.       }
  26.     }
  27.     }
复制代码
  1.     package main
  2.     import (
  3.     "fmt"
  4.     "time"
  5.     )
  6.     //main()相当于是主协程
  7.     func main() {
  8.     //匿名子协程
  9.     go func() {
  10.     i := 0
  11.     for {
  12.     i++
  13.     fmt.Println("子协程 i=", i)
  14.     time.Sleep(1 \* time.Second)
  15.     }
  16.     }()
  17.     }
复制代码
runtime 包

  1.     package main
  2.     import (
  3.     "fmt"
  4.     "runtime"
  5.     )
  6.     func main() {
  7.     //匿名子协程
  8.     go func(s string) {
  9.     for i := 0; i < 2; i++ {
  10.     fmt.Println(s)
  11.     }
  12.     }("world")
  13.     //主协程
  14.     for i := 0; i < 2; i++ {
  15.     runtime.Gosched()
  16.     fmt.Println("hello")
  17.     }
  18.     }
复制代码
  1.     package main
  2.     import (
  3.     "fmt"
  4.     "time"
  5.     "runtime"
  6.     )
  7.     func main() {
  8.     //匿名子协程
  9.     go func() {
  10.     defer fmt.Println("A.defer")
  11.     //匿名函数
  12.     func() {
  13.     defer fmt.Println("B.defer")
  14.     //此时只有defer执行
  15.     runtime.Goexit()
  16.     fmt.Println("B")
  17.     }()
  18.     fmt.Println("A")
  19.     }()
  20.     for {
  21.     time.Sleep(time.Second)
  22.     }
  23.     }
复制代码
  1.     package main
  2.     import (
  3.     "runtime"
  4.     "fmt"
  5.     )
  6.     func main() {
  7.     n := runtime.GOMAXPROCS(3)
  8.     fmt.Println("n=%d\n",n)
  9.     //循环执行2个
  10.     for{
  11.     go fmt.Print(0)
  12.     fmt.Print(1)
  13.     }
  14.     }
复制代码
channel

Channel  基本使用

<ul>Channel 可以用内置make() 创建
定义一个channel 也需要定义发送到channel值类型
make(chan 类型) // 无缓冲通道
make(chan 类型, 容量) // 有缓冲通道当capacity=0 时, channel 是无缓冲阻塞读写的,当capacity>0, channel 有缓冲,是非阻塞的,直到写满capacity个元素才阻塞写入
channel 通过操作符




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4