九、goroutine和channel
进程和线程
A)进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单元
B)线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位
C)一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行

nginx是 进程 ----》Fork多个子进程 --》多线程 --》多进程程序
协程和线程
协程:独立的栈空间,共享堆内存,调度由用户自己控制,本质上有点类似于用户级线程,这些用户线程的调度也是自己实现的
线程:一个线程上可以跑多个协程,协程是轻量级的线程
线程分为用户态的线程和操作系统级别的线程
goroutine:
package main import (
"fmt"
"time"
) func test(){
var i int
for {
fmt.Println(i)
time.Sleep(time.Second)
i++
}
} func main(){
go test()
for{
fmt.Println("i running in main")
time.Sleep(time.Second) //必须要加上,防止main线程跑的太快看不清
}
} 执行结果
D:\project>go build go_dev/day8/example
D:\project>example
i running in main
0
1
i running in main
i running in main
2
3
i running in main
i running in main
4
5
i running in main
i running in main
6
goroutine调度模型

M:系统里面的线程
P:调度器
G:协程 goroutine
1)可以看出上面的每个操作系统线程有4个协程执行,只不过有3个协程是在队列中执行
2)可以看出一个线程可以多个协程在跑
在1.8之前可以把程序设置到init函数里面,1.8以上不用设置cpu的核心数
如何设置golang运行的cpu核数
package main import (
"runtime"
"fmt"
) func main(){
num := runtime.NumCPU() //查找当前cpu的核心数量
runtime.GOMAXPROCS(num) //设置golang运行核数 这里结果为8
fmt.Println(num)
}
运行结果
channel声明
var 变量名 chan 类型
var test chan int
var test chan string
var test chan map[string] string
var test chan stu
var test chan *stu
channl初始化使用make
变量名 = make (chan 类型 size)
创建map类型往channel里面添加数据
创建map类型往channel里面添加数据
package main func main(){
var mapchan chan map[string]string //声明channel
mapchan = make(chan map[string]string ,10) //初始化channel
m := make(map[string]string) //初始化map
m["stu01"]="stu01" mapchan <- m //往channel里面添加数据
} 创建struct,往channel里面添加数据
package main type student struct{
name string
} func main(){
var stuchan chan student
stuchan = make(chan student,10) stu:=student{name:"stu01"} stuchan <- stu } 指针形式添加到channel
package main type student struct{
name string
} func main(){
var stuchan chan *student
stuchan = make(chan *student,10) stu:=student{name:"stu01"} stuchan <- &stu }
channel超时处理
利用select来处理chan超时
for {
select {
case v := <-chan1:
fmt.Println(v)
case v := <-chan2:
fmt.Println(v)
default:
time.Sleep(time.Second)
fmt.Println("timeout...")
}
}
time.After()定时器来做处理。
在time.After()计时器触发之前,底层计时器不会被垃圾收集器回收。
九、goroutine和channel的更多相关文章
- TODO:Go语言goroutine和channel使用
TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...
- goroutine 加 channel 代替递归调用,突破递归调用的层级限制
package main import ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/B ...
- Go基础--goroutine和channel
goroutine 在go语言中,每一个并发的执行单元叫做一个goroutine 这里说到并发,所以先解释一下并发和并行的概念: 并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个 ...
- goroutine和channel
近期在学习golang的goroutine和channel时候有一些疑惑: 带缓冲的channel和不带缓冲的channel有什么区别? goroutine和主进程的有哪些影响和关系? 多个gorou ...
- [转帖]go 的goroutine 以及 channel 的简介.
进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间 ...
- Go part 8 并发编程,goroutine, channel
并发 并发是指的多任务,并发编程含义比较广泛,包含多线程.多进程及分布式程序,这里记录的并发是属于多线程编程 Go 从语言层面上支持了并发的特性,通过 goroutine 来完成,goroutine ...
- Go开发[八]goroutine和channel
进程和线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个进程可以创 ...
- Go--关于 goroutine、channel
Go--关于 goroutine.channel goroutine 协程是一种轻量化的线程,由Go编译器进行优化. Go协程具有以下特点: 有独立的栈空间 共享程序堆中的空间 调度由用户控制 如果主 ...
- go并发之goroutine和channel,并发控制入门篇
并发的概念及其重要性 这段是简单科普,大佬可以跳过 并发:并发程序指同时进行多个任务的程序.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行 ...
随机推荐
- [浪风JQuery开发]jquery最有意思的IFrame类似应用--值得深入研究
前几天一时兴起答应朋友的需求--做一个外国的企业网站: 本想做就做呗,可没想我辛辛苦苦用浪风认真php平台开发后,对方来一句我服务器不能安装其他程序,请给我用frame框架开发. 浪风那是一个苦字难言 ...
- Linux 常用文件管理命令
Command Description cat filename 查看文件内容.举例:cat pushticketfast.sh --最好用tail -n 500 cd dirname 改变所在 ...
- UNIX网络编程卷1 server程序设计范式1 并发server,为每一个客户请求fork一个进程
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.传统并发server调用 fork 派生一个子进程来处理每一个客户 2.传统并发serv ...
- js intanceof 或 typeof
typeof和instanceof的区别 typeof和instanceof都可以用来判断变量,它们的用法有很大区别: typeof会返回一个变量的基本类型,只有以下几种:number,boolean ...
- Material design之Material Theme
Material Theme提供了三方面的内容: 系统组件的颜色可以自定义更改 系统组件添加了触摸反馈动画效果 Activity切换动画效果 系统主题默认被定义在以下三个样式中: 使用Material ...
- Scala之模式匹配(Patterns Matching)
前言 首先.我们要在一開始强调一件非常重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中.这是Scala模式匹配之所以重要且实用的一个关键因素!我们会在文章的后半部分具 ...
- Scanner类与Random类
1.Scanner类 Scanner类的作用是获得输入,下面代码用于获得用户的键盘输入,实例如下: 常用方法: String next():将输入信息的下一个标记扫描为一个字符串 Int nextIn ...
- 文件存储 FileUtil FileBaseDto
package com.guige.base.fileutils; import com.alibaba.fastjson.JSONArray; import com.aliyun.oss.Servi ...
- poj 3590(dp 置换)
题目的意思是对于序列1,2,...,n.要你给出一种字典序最小的置换使得经过X次后变成最初状态,且要求最小的X最大. 通过理解置换的性质,问题可以等价于求x1,x2,..,xn 使得x1+x2+... ...
- sqlbulk的问题
今天在bulk的时候遇到一个很“奇怪”的问题 无论怎样修改传入的值,也会报类型转换的错误.后来 在此文中找到了正解 bbs.csdn.net/topics/390430064 SqlBulkCopy不 ...