go14--并发concurrency,goroutine,channel

672530440 672530440     2022-10-05     348

关键词:

package main

/**

并发concurrency

很多人都是冲着 Go 大肆宣扬的高并发而忍不住跃跃欲试,但其实从
源码的解析来看,goroutine 只是由官方实现的超级“线程池”而已。
不过话说回来,每个实例 4-5KB 的栈内存占用和由于实现机制而大幅
减少的创建和销毁开销,是制造 Go 号称的高并发的根本原因。另外,
goroutine 的简单易用,也在语言层面上给予了开发者巨大的便利。

并发不是并行:
并发切换时间片,单核是没有并行的,只有一个线程,在并行则是直接利用
多核实现多线程的运行,多核是并行,有多个线程,但 Go 可以设置使用核数,以发挥多核计算机
的能力。

高并发:因为创建销毁的很快,每一个占内存很小,
Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。

*/
import (
    "fmt"
    "runtime"
    "time"
)

func main1() {
    go GO()                     //这就是一个Goroutine,运行了一个Goroutine,
    time.Sleep(2 * time.Second) //暂停2秒钟,不暂停是不会输出的GOGOGO的,
}

func GO() {
    fmt.Println("GOGOGO")
}

func main2() {
    c := make(chan bool) //创建一个channel
    go func() {          //go后面接一个匿名函数
        fmt.Println("GGGGGOOOOOO")
        c <- true //channel中存入true或false随便,
    }()
    <-c //从channel中取出来,go启动一个Goroutine之后main函数就执行到<-c并且阻塞了,因为他在等着从
    //channel中取出东西来,只有c <- true执行了,放入东西到channel了,main就可以取出东西来了,
    //通知main函数,他那里执行完毕了,main就继续执行完了
}

func main3() {
    c := make(chan bool)
    go func() {
        fmt.Println("GGGGGOOOOOO")
        c <- true //执行打印v,执行fmt.Println(v),
        close(c)  //关闭不再迭代,不关闭则一直打印死锁了
    }()
    for v := range c { //迭代channel的时候,一直在等待有值进去,才可以取出来,在打印出来,
        fmt.Println(v)
    }
    /*
        GGGGGOOOOOO
        true
    */
}

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU()) //返回当前cpu的核数,并利用多核操作Goroutine(Goroutine是线程池)
    c := make(chan bool)
    for i := 0; i < 10; i++ {
        go GO1(c, i) //启动9个goroutine
    }
    <-c //告诉main函数可以退出了
}

func GO1(c chan bool, index int) {
    a := 1

    for i := 0; i < 100000000; i++ {
        a += 1
    }
    fmt.Println(index, a)
    if index == 9 { //启动第九个goroutine的时候就可以告诉main函数可以退出了,
        //多核的时候index=9不一定是最后执行的,所以不一定会执行9遍,有可能执行一遍就退出了,解决方法:缓存的channel
        c <- true
    }
}

 

package main

import (
    "fmt"
    "runtime"
)

//缓存的channel
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    c := make(chan bool, 10) //缓存的channel,缓存10个,
    for i := 0; i < 10; i++ {
        go GO1(c, i)
    }
    for i := 0; i < 10; i++ {
        <-c //取10次,就知道goroutine执行完了,这样就保证了能够打印10 次
    }
}

func GO1(c chan bool, index int) {
    a := 1

    for i := 0; i < 100000000; i++ {
        a += 1
    }
    fmt.Println(index, a) //,这样就保证了能够打印10 次
    c <- true             //存10次
}

/*
    9 100000001
    5 100000001
    0 100000001
    8 100000001
    7 100000001
    4 100000001
    1 100000001
    2 100000001
    6 100000001
    3 100000001
*/

 

package main

import (
    "fmt"
    "runtime"
    "sync" //有一个任务组,每完成一个任务就减一,等任务数为0的时候任务就完成了
)

//第二种解决方案:同步,通过同步包实现多个Goroutine 打印内容
func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())
    wg := sync.WaitGroup{} //创建一个任务组
    wg.Add(10)             //添加10个任务

    for i := 0; i < 10; i++ {
        go GO1(&wg, i) //添加10个Goroutine
    }

    wg.Wait() //等待
}

func GO1(wg *sync.WaitGroup, index int) {
    fmt.Println(index) //打印就是一次任务
    wg.Done()          //任务完成一次
}

/*
    0 9 1 2 3 4 5 6 7 8
*/

 

go语言基础之并发concurrency

并发Concurrency  很多人都是冲着Go大肆宣扬的高并发而忍不住跃跃欲试,但其实从源码的解析来看,goroutine只是由官方实现的超级“线程池”而已。不过话说回来,每个实例4~5KB的栈内存占用和由于实现机制而大幅减少的创建... 查看详情

go并发3

...景来自GoogleIO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel生成器在Python中我们可以使用Go中我们可以使用信道来制造生成器( 查看详情

go并发编程byexamples(代码片段)

转载自本人独立博客:https://liushiming.cn/2020/01/21/concurrent-programming-in-go-by-examples/概述并发是go的一个吸引开发者的特性,也是一个难点,以下整理自我在公司的一个内部分享,全部都是以示例的形式进行说明,有兴趣跑一下就掌... 查看详情

go并发模型:超时,继续(timingout,movingon译文)(代码片段)

Go并发模型:超时,继续(GoConcurrencyPatterns:Timingout,movingon)英文原版:https://blog.golang.org/concurrency-timeouts并发编程有它自己的特点,比如超时。虽然go语言的channel没有直接支持,但是这些特点很容易被实现出来。假设... 查看详情

2021-go语言并发编程

2021-GO语言并发编程1、Go语言并发概述2、GO语言多进程编程3、Go语言并发简略-多线程4、Go语言并发简略-非阻塞IO5、Go语言并发简略-协程6、并发简略-对比并发模型7、Go语言goroutine8、Go语言channel9、Go语言channel的操作10、Go语言channel... 查看详情

java-并发-concurrent综述

综述java.util.concurrent包含许多线程安全、测试良好、高性能的并发构建块。不客气地说,创建java.util.concurrent的目的就是要实现Collection框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块,开发人员可以... 查看详情

go的并发(代码片段)

Go的并发1.并发https://docs.microsoft.com/zh-cn/learn/modules/go-concurrency/1-goroutinesGoroutinegoroutine是轻量线程中的并发活动,而不是在操作系统中进行的传统活动。假设你有一个写入输出的程序和另一个计算两个数字相加的函数。一个并... 查看详情

java并发编程系列concurrent包概览

从JDK1.5开始,增加了java.util.concurrent包,concurrent包的引入大大简化了多线程程序的开发。查看JDK的API可以发现,java.util.concurrent包分成了三个部分,分别是java.util.concurrent、java.util.concurrent.atomic和java.util.concurrent.lock。>>Atomic... 查看详情

go语言学习目录(主要以图解的形式来完成学习目录,参考无闻大神)

1.Go开发环境搭建2.Go基础知识3.类型与变量4.常量与运算符5.控制语句6.数组array7.切片slice8.map9.函数function10.结构struct11.方法method12.接口interface13.反射reflection14.并发concurrency15.项目与坑 查看详情

java并发之concurrent包综述

■并发原理单核系统:线程交替执行,由于交替又快又多,给人一种同时执行的感觉多核系统:不仅可以交替执行线程,而且可以重叠执行线程补充:本章指的并发主要指的是线程间的并发 ■常见的并发机制 ■不同系统... 查看详情

python异步并发模块concurrent.futures入门详解

concurrent.futures模块详解Executor对象class concurrent.futures.ExecutorExecutor是一个抽象类,它提供了异步执行调用的方法。它不能直接使用,但可以通过它的两个子类ThreadPoolExecutor或者ProcessPoolExecutor进行调用。2.1.1Executor.submit(fn,*args,**... 查看详情

使用concurrent.futures模块并发,实现进程池线程池

一、关于concurrent.futures模块Python标准库为我们提供了threading和multiprocessing模块编写相应的异步多线程/多进程代码。从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类ThreadPoolExe... 查看详情

使用countdownlatch模拟高并发场景

importjava.util.concurrent.CountDownLatch;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.atomic.AtomicInteger;publicclassIncrTest{publicstat 查看详情

高并发第八弹:j.u.c起航(java.util.concurrent)

java.util.concurrent是JDK自带的一个并发的包主要分为以下5部分:并发工具类(tools)显示锁(locks)原子变量类(aotmic)并发集合(collections)Executor线程执行器我们今天就说说并发集合,除开Queue,放在线程池的时候讲先介绍以下CopyOnWrite:Copy-On-Wr... 查看详情

并发管理的并发请求表fnd_concurrent_requests,这个表有三个时间列

并发管理的并发请求表fnd_concurrent_requests,这个表存在三个时间:requested_start_date    --Thedateandtimewhenuserswanttherequesttostartrunning(用户希望请求开始运行的日期和时间)request_date      查看详情

按名称保留并发请求

UPDATEFND_CONCURRENT_REQUESTSSEThold_flag='Y'WHEREREQUEST_IDIN(SELECTcr.REQUEST_IDFROMfnd_concurrent_programs_tlcp,fnd_concurrent_requestscrWHEREcp.application_id=cr.program_application_idANDcp.concurrent_program_id=cr.concurrent_program_idANDDECODE(cp.USER_CONCURRENT_PROGRAM_NAME,'ReportSet... 查看详情

并发解谜:Java Concurrency - Cyclicbarrier。正确用法?

】并发解谜:JavaConcurrency-Cyclicbarrier。正确用法?【英文标题】:Concurrentpuzzlesolving:JavaConcurrency-Cyclicbarrier.Correctusage?【发布时间】:2014-05-1920:11:46【问题描述】:我正在尝试编写一个程序来解决2个无法相互独立解决但具有相同... 查看详情

java并发(concurrent)包源码分析

参考连接:http://www.cnblogs.com/luoxn28/p/6059881.htmlhttp://www.cnblogs.com/java-zhao/p/5140158.html持续更新中。。。。。并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力。如果程序中一个耗时的任务能以异步或并行的方式... 查看详情