首页 > 其他分享 >Go并发

Go并发

时间:2022-12-29 15:57:58浏览次数:40  
标签:int 并发 func time Go println main go

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

var c int

func counter() int {
    c++
    return c
}

func main2() {
    a := 100

    go func(x, y int) {
        time.Sleep(time.Second)
        println("go:", x, y)
    }(a, counter())

    a += 100
    println("main:", a, counter())

    time.Sleep(time.Second * 3)
}

// 进程退出不会等待并发任务结束,可用通道阻塞,然后发出退出信号
func main3() {
    exit := make(chan struct{})

    go func() {
        time.Sleep(time.Second)
        println("goroutine ....")

        // 除关闭通道外,写入数据也可接触通道
        close(exit)
    }()

    println("main ....")
    <-exit
    println("main exit.")
}

// 等待多个并发任务结束,使用sync.WaitGroup
func main4() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1) // 累加计数

        go func(id int) {
            defer wg.Done() // 递减计数

            time.Sleep(time.Second)
            println("goroutine", id, "done.")
        }(i)
    }

    println("main ...")
    wg.Wait()
    println("main exit.")
}

// 可在多处使用wait,它们都能接收到通知
func main5() {
    var wg sync.WaitGroup
    wg.Add(1)

    go func() {
        wg.Wait() // 等待归零,解除阻塞
        println("wait exit.")
    }()

    go func() {
        time.Sleep(time.Second)
        println("done.")
        wg.Done()
    }()

    wg.Wait() // 等待归零,解除阻塞
    println("main exit.")
}

func main7() {
    var wg sync.WaitGroup
    var gs [5]struct {
        id     int
        result int
    }

    for i := 0; i < len(gs); i++ {
        wg.Add(1)

        go func(id int) {
            defer wg.Done()

            gs[id].id = id
            gs[id].result = (id + 1) * 100
        }(i)
    }

    wg.Wait()
    fmt.Printf("%+v\n", gs)
}

// Gosched 暂停,释放线程去执行其他任务。当前任务被放回队列,等待下次调度时恢复执行
func main8() {
    runtime.GOMAXPROCS(1)
    exit := make(chan struct{})

    go func() {
        defer close(exit)

        go func() {
            println("b")
        }()

        for i := 0; i < 4; i++ {
            println("a:", i)

            if i == 1 { // 让出当前线程,调度执行 b
                runtime.Gosched()
            }
        }
    }()

    <-exit
}

// Goexit 立即终止当前任务,运行时确保所有已注册延迟调用被执行
// 无论身处哪一层,Goexit 都能立即终止整个调用栈,这与return仅退出当前函数不同
// 标准库函数 os.Exit 可终止进程,但不会执行延迟调用
func main9() {
    exit := make(chan struct{})

    go func() {
        defer close(exit)
        defer println("a")

        func() {
            defer func() {
                println("b", recover() == nil)
            }()

            func() {
                println("c")
                runtime.Goexit() // 立即终止整个调用栈
                println("c done.")
            }()

            println("b done.")
        }()

        println("a done.")
    }()

    <-exit
}

  

标签:int,并发,func,time,Go,println,main,go
From: https://www.cnblogs.com/minch/p/17012717.html

相关文章

  • Django简介以及基本使用
    目录Django简介以及基本使用一、django简介1.web框架的本质是什么?2.python主流web框架有那些?3.web框架的推导过程二、基本使用1.运行django注意事项2.下载Django的终端命......
  • SpringBoot+MongoDB实现一个物流订单系统
    码字不易,点赞收藏,养成习惯!原创作者公众号:​​bigsai​​​,回复bigsai领取5G的PDF学习资源!共同进步。更多精彩期待与您分享!项目收录在​​​github​​​的​​MongoDB案例......
  • django项目中使用swagger来实现接口文档自动生成
    一、Swagger一般我们在对接前后端的时候,都需要提供相应的接口文档。对于后端来说,编写接口文档即费时费力,还会经常因为没有及时更新,导致前端对接时出现实际接口与文档不一......
  • 狂神说Go语言—错误与异常
    什么是错误error什么是错误错误指的是可能出现问题的地方出现了问题。比如打开一个文件时失败,这种情况在人们的意料之中。和错误类似的还有一个异常,指的是不应该出现......
  • 获取USG防火墙的NAT记录并发邮件给相应人员提醒
    授权USGNAT配置的时候需要遵循NAT_张三_20221201_长期importparamikoimportsmtplibfromemail.mime.textimportMIMETextfromemail.headerimportHeaderimpor......
  • 线程并发编程之美
    多线程并发编程之美等待线程执行终止的join方法执行的代码publicclassMyThreadThree{publicstaticvoidmain(String[]args)throwsInterruptedException......
  • 结合商业项目深入理解Go知识点
    这篇文章比较硬核,爆肝5千字,把之前整理的知识点都串起来了。建议先收藏,慢慢看。前言上一篇文章#【GoWEB进阶实战】开源的电商前后台API系统很受大家欢迎,有好多小伙伴......
  • uwsgj启动django服务 Djangoweb服务的部署采用 Nginx+uWSGI的方式
    1、SQLite3.8.3orlaterisrequired(found3.6.20).2、django.db.utils.Notsupportederror:urlsnotsupported3、nointernalroutingsupport,rebuildwithpcre......
  • Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?
    写在开头对于Java领域中的锁,其实从接触Java至今,我相信每一位JavaDeveloper都会有这样的一个感觉?不论是Java对锁的实现还是应用,真的是一种“群英荟萃”,而且每一种锁都有点各......
  • 并发-框架[老的,有时间我重新整理一下]
    并发-框架[老的,有时间我重新整理一下]文章是直接从我本地word笔记粘贴过来的,排版啥的可能有点乱,凑合看吧,有时间我会慢慢整理Fork-Joinjava下多线程的开发可以我们自己启......