进程和线程

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的更多相关文章

  1. TODO:Go语言goroutine和channel使用

    TODO:Go语言goroutine和channel使用 goroutine是Go语言中的轻量级线程实现,由Go语言运行时(runtime)管理.使用的时候在函数前面加"go"这个 ...

  2. goroutine 加 channel 代替递归调用,突破递归调用的层级限制

    package main import ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/B ...

  3. Go基础--goroutine和channel

    goroutine 在go语言中,每一个并发的执行单元叫做一个goroutine 这里说到并发,所以先解释一下并发和并行的概念: 并发:逻辑上具备同时处理多个任务的能力 并行:物理上在同一时刻执行多个 ...

  4. goroutine和channel

    近期在学习golang的goroutine和channel时候有一些疑惑: 带缓冲的channel和不带缓冲的channel有什么区别? goroutine和主进程的有哪些影响和关系? 多个gorou ...

  5. [转帖]go 的goroutine 以及 channel 的简介.

    进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间 ...

  6. Go part 8 并发编程,goroutine, channel

    并发 并发是指的多任务,并发编程含义比较广泛,包含多线程.多进程及分布式程序,这里记录的并发是属于多线程编程 Go 从语言层面上支持了并发的特性,通过 goroutine 来完成,goroutine ...

  7. Go开发[八]goroutine和channel

    进程和线程 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 一个进程可以创 ...

  8. Go--关于 goroutine、channel

    Go--关于 goroutine.channel goroutine 协程是一种轻量化的线程,由Go编译器进行优化. Go协程具有以下特点: 有独立的栈空间 共享程序堆中的空间 调度由用户控制 如果主 ...

  9. go并发之goroutine和channel,并发控制入门篇

    并发的概念及其重要性 这段是简单科普,大佬可以跳过 并发:并发程序指同时进行多个任务的程序.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行 ...

随机推荐

  1. python 设计模式之单例模式

    单例模式就是防止每个请求到来,都需要在内存里创建一个实例,再通过该实例执行指定的方法. 如果并发量大的话,内存里就会存在非常多功能上一模一样的对象.存在这些对象肯定会消耗内存,对于这些功能相同的对象可 ...

  2. 进程 vs. 线程

    我们介绍了多进程和多线程,这是实现多任务最常用的两种方式.现在,我们来讨论一下这两种方式的优缺点. 首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Work ...

  3. python提供了一个进行hash加密的模块:hashlib

    python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...

  4. iOS-获取的NSDate date时间与实际相差8个小时解决方案

    本文转载至 http://blog.sina.com.cn/s/blog_51a995b70101iptl.html NSDate *date = [NSDate date]; NSTimeZone  ...

  5. python 引用的含义,尤其注意列表跟字典的使用

    a = '12345'b = aa = 'sssss'print('a ===== %s' % a)print('b ===== %s' % b) 结果: a ===== sssss  b ===== ...

  6. 《从零开始学Swift》学习笔记(Day 29)——访问级别

    Swift 2.0学习笔记(Day 29)——访问级别 原创文章,欢迎转载.转载请注明:关东升的博客 访问级别: Swift提供了3种不同访问级别,对应的访问修饰符为:public.internal和 ...

  7. (三)Solrj4到Solrj5的升级之路

    (三)Solrj4到Solrj5的升级之路 Solr5发布了,带来了许多激动人心的新特性,但Solrj的许多接口也发生了变化,升级是痛苦的,但也是必须的,下面就赶紧来看看有哪些代码需要升级吧. 变化1 ...

  8. Solr 查询时候关键期 编码问题

    背景架构: 中间是dubbo 调用, 其实还是编码问题!没啥大问题!记录下

  9. spring web中完成单元测试

    对于在springweb总完单元测试,之前找过些资料,摸索了很久,记录下最终自己使用的方法 1,创建测试类,创建测试资源文件夹 src/test/resources/WEB_INFO/conf 将工程 ...

  10. 将电脑中编写的app网页放到手机上访问

    http://jingyan.baidu.com/article/3065b3b6e5becdbecff8a4d5.html 1.在控制面板-管理工具找不到IIS,则先在程序-打开或关闭window功 ...