go 语言 并发,并行,信道

go语言

  并发

  并行

  信道

package main

import (
    "fmt"
    "time"
)
补充:
//并发:看上去在同一时间同时执行,实际是切换执行利用时间片轮转法,同一个CPU进行切换执行
// 并行:是在真正的同一时间两个程序同时进行吗,这个是在多核cpu情况下,同一时刻,两个事情同时进行
//进程:进程是程序执行的最小单位,例如qq进程,迅雷进程,
//   线程: 例如迅雷进程中,有上传,下载,上传就是一个线程,下载就是另一个线程
//   协程:当线程碰到io操作时,就会一直停在那里,这个线程就一直处于浪费状态,此时我可以让这个线程转而去做其他的事,
//       此时,就不是操作系统控制,而是由程序去控制,所以有genevt这个第三方模块,自动实现io切换,这就是单线程下实现并发即协程
// node.js 本身只能在游览器中去执行,于是写了一个引擎,让代码跑在这个引擎上(类似于解释器)就可以跑在服务端上
// 虽然js是一个解释型语言,但是node.js 使用了一个事件驱动,非阻塞i/o模型,运行特别快,碰到io就切
// python 的async/await 协程  http请求用asyncio  异步框架sanic
// python 中要想速度高,就得使用异步编程,异步框架

//go中用关键字go即可,go语言并发性能高,go协程
// go协程原理:go语言一旦跑起来,会在内部建一个很大的线程池,在线程池中go自己写好了算法,自己去调度,遇到io自己去切,自己去执行任务

func test()  {
    fmt.Println("hello go")
}
//协程之间如何进行数据通信,就用信道
func main()  {
    //本质是goroutine  当新开的线程没结束,主线程已经结束了,所以要想打印,就得等待一会
    go test()
    go test()
    go test()
    go test()
    go test()    //是开了好多,速度很快
    time.Sleep(time.Second*2)//Second表示秒 ,此时表示睡2秒
}

信道

  也叫管道,通道,go是csp管道模型进行通信

package main

import (
    "fmt"
)

//信道
//信道也是一个变量,信道运输的类型必须固定
// 重点:信道的放值和取值在默认情况下都是阻塞的
// 单向信道,即只能放或者只能取
// 关闭信道,信道关闭后就不能再放取值了 close(信道名),用rang
func test1(c chan bool)  {
    fmt.Println("hello go")
    //一旦执行完了,在信道中放入一个值  ***********++++++++++
    c <-true  //向信道中放值
}

func main() {
    //定义一个信道,关键字chan 后面跟信道类型
    //信道的空值是 nil 引用类型
    //var a chan int   //表示定义了一个int类型的信道,该信道只能运输int类型的数据
    //fmt.Println(a)

    //信道定义并初始化
    var a chan int =make(chan int)
    fmt.Println(a)
    //重点:放值和取值
    //箭头向信道变量,就是往信道中放值
    a <-1
    //箭头向外,表示从信道中取值  <-a 表示从信道取出来的值不要了(没赋值给变量)
    var b int= <-a
    fmt.Println(b)
    //信道默认情况下,取值和赋值都是阻塞的,就是一旦向信道中放入一个值,程序就卡在这里,不会继续向下执行,
    //此时必须另一个协程把它取走,程序才会继续执行,如果这个协程取,里面没有值,这个协程也会卡在这里

    //定义一个信道
    var c chan bool=make(chan bool)  //必须初始化
    go test1(c)
    //从信道中取出值,***********++++++++++
    d:=<-c
    fmt.Println(d)
    //time.Sleep(time.Second*2)

}

用rang循环,

3,缓冲信道

  信道的本质是刚开始信道里并没有放值,所以才会阻塞,此时放是放不进去的,只有有另一个去取的时候,两者一对接,把值给它了

  缓冲信道,有缓冲大小

package main

import "fmt"

func main() {
//    缓冲信道
    //定义一个缓冲大小为3的信道
    var a chan int = make(chan int,3)
    a <-1
    a <-2
    a <-3
    //a <-4   //缓冲大小为3,只能放3个,此时超了,就会阻塞,但是程序不会一直处于阻塞,此时就报死锁错误
    <-a
    <-a  //取值
    b:=<-a
    fmt.Println("xxx")
    fmt.Println(b)  //3   如果再取就会报死锁错误
}

缓冲信道例子(协程的利用)

原文地址:https://www.cnblogs.com/Fzhiyuan/p/12046342.html

时间: 2024-11-03 03:25:57

go 语言 并发,并行,信道的相关文章

Go语言并发与并行学习笔记(三)

目录(?) [-] Go语言并发的设计模式和应用场景 生成器 服务化 多路复合 select监听信道 结束标志 菊花链 随机数生成器 定时器 TODO Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Pytho

Go语言开发(九)、Go语言并发编程

Go语言开发(九).Go语言并发编程 一.goroutine简介 1.并发与并行简介 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行.并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行.并行在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是因为并发是并行的假象,并行要

30分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程.线程是操作系统分配处理器时间的基本单元,在进程中可以有多个线程同时执行代码.进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的.进程可以理解为一个程序的基本边界.是

融云开发漫谈:你是否了解Go语言并发编程的第一要义?

2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻译引进国内,并迅速引起广泛关注,本书由融云的一位研发工程师赵晨光联合翻译,旨在帮助Go语言学习者了解并发设计的模式和应用场景,更加深入理解Go语言特性,从而提升自身技术研发水平. “Go语言并发编程快速入门的第一要义” <Go语言并发之道>主要讲解了Golang语言的最佳实践和模式,引导读者如何选

Go语言之Go语言并发

Go 语言并发 Golang从语言层面就对并发提供了支持,而goruntine是Go语言并发设计的核心. Go语言的并发机制运用起来非常舒适,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量. 进程&线程 A.进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. B.线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. C.一个进程可以创建和撤销多个线程:同一个进程中的多个线程之间可以并发执行. 并

Go语言并发编程示例 分享(含有源代码)

GO语言并发示例分享: ppt http://files.cnblogs.com/files/yuhan-TB/GO%E8%AF%AD%E8%A8%80.pptx 代码, 实际就是<<Go语言程序设计>> (Mark Summerfield[英]著,许式伟 吕桂华 徐立 何李石 译) 第七章的全部示例: http://files.cnblogs.com/files/yuhan-TB/blog_go.tar.gz

多线程爬坑之路--并发,并行,synchonrized同步的用法

一.多线程的并发与并行: 并发:多个线程同时都处在运行中的状态.线程之间相互干扰,存在竞争,(CPU,缓冲区),每个线程轮流使用CPU,当一个线程占有CPU时,其他线程处于挂起状态,各线程断续推进. 并行:多个线程同时执行,但是每个线程各自有自己的CPU,不存在CPU资源的竞争,他们之间也可能存在资源的竞争. 并发发生在同一段时间间隔内,并行发生在同一时刻内.并发执行的总时间是每个任务的时间和,而并行则取决于最长任务的时间. 下面看一下A,B两个任务在并行和并发情况下是怎么执行的:[不考虑其他资

并发&amp;并行 同步&amp;异步 GIL 任务 同步锁 死锁 递归锁

# 并发&并行 同步&异步 GIL 任务 同步锁 死锁 递归锁 # 并发:是指系统具有处理多个任务(动作)的能力 # 并行:是指系统具有 同时 处理多个任务(动作)的能力 # 同步:当进程执行到一个IO(等待外部数据)的时候,需要等待外部数据接收完 # 异步:当进程执行到一个IO(等待外部数据)的时候,不需要等待外部数据接收完,还可以做其它的处理 # GIL: 全局解释器锁 在python中,无论你启多少个线程,你有多少个cpu,python在执行的时候在同一时刻只请允许一个线程运行 #

同步/异步/阻塞/非阻塞/并发/并行

1. 概念 1.1 同步和异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由调用者主动等待这个调用的结果. 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果.而是在调用发出后,被调用者通过状态.通知来通