进程和线程

A)进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单元

B)线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位

C)一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行

nginx是       进程    ----》Fork多个子进程   --》多线程   --》多进程程序

协程和线程

协程:独立的栈空间,共享堆内存,调度由用户自己控制,本质上有点类似于用户级线程,这些用户线程的调度也是自己实现的

线程:一个线程上可以跑多个协程,协程是轻量级的线程

线程分为用户态的线程和操作系统级别的线程

goroutine

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. func test(){
  9. var i int
  10. for {
  11. fmt.Println(i)
  12. time.Sleep(time.Second)
  13. i++
  14. }
  15. }
  16.  
  17. func main(){
  18. go test()
  19. for{
  20. fmt.Println("i running in main")
  21. time.Sleep(time.Second) //必须要加上,防止main线程跑的太快看不清
  22. }
  23. }
  24.  
  25. 执行结果
  26. D:\project>go build go_dev/day8/example
  27. D:\project>example
  28. i running in main
  29. 0
  30. 1
  31. i running in main
  32. i running in main
  33. 2
  34. 3
  35. i running in main
  36. i running in main
  37. 4
  38. 5
  39. i running in main
  40. i running in main
  41. 6

 

goroutine调度模型

 

M:系统里面的线程

P:调度器

G:协程 goroutine

1)可以看出上面的每个操作系统线程有4个协程执行,只不过有3个协程是在队列中执行

2)可以看出一个线程可以多个协程在跑

在1.8之前可以把程序设置到init函数里面,1.8以上不用设置cpu的核心数

如何设置golang运行的cpu核数

  1. package main
  2.  
  3. import (
  4. "runtime"
  5. "fmt"
  6. )
  7.  
  8. func main(){
  9. num := runtime.NumCPU() //查找当前cpu的核心数量
  10. runtime.GOMAXPROCS(num) //设置golang运行核数 这里结果为8
  11. fmt.Println(num)
  12. }
  13. 运行结果

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里面添加数据

  1. 创建map类型往channel里面添加数据
  2. package main
  3.  
  4. func main(){
  5. var mapchan chan map[string]string //声明channel
  6. mapchan = make(chan map[string]string ,10) //初始化channel
  7. m := make(map[string]string) //初始化map
  8. m["stu01"]="stu01"
  9.  
  10. mapchan <- m //往channel里面添加数据
  11. }
  12.  
  13. 创建struct,往channel里面添加数据
  14. package main
  15.  
  16. type student struct{
  17. name string
  18. }
  19.  
  20. func main(){
  21. var stuchan chan student
  22. stuchan = make(chan student,10)
  23.  
  24. stu:=student{name:"stu01"}
  25.  
  26. stuchan <- stu
  27.  
  28. }
  29.  
  30. 指针形式添加到channel
  31. package main
  32.  
  33. type student struct{
  34. name string
  35. }
  36.  
  37. func main(){
  38. var stuchan chan *student
  39. stuchan = make(chan *student,10)
  40.  
  41. stu:=student{name:"stu01"}
  42.  
  43. stuchan <- &stu
  44.  
  45. }

channel超时处理

利用select来处理chan超时

  1. for {
  2. select {
  3. case v := <-chan1:
  4. fmt.Println(v)
  5. case v := <-chan2:
  6. fmt.Println(v)
  7. default:
  8. time.Sleep(time.Second)
  9. fmt.Println("timeout...")
  10. }
  11. }

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. Hibernate通过many-to-one元素的一对一映射

    在hibernate中我们可以通过两种方式来执行一对一映射: 通过many-to-one元素标签 通过one-to-one元素标签 在这里,我们将通过多对一的many-to-one元素进行一对一的映射 ...

  2. Eclipse 添加书签

    Eclipse 添加书签 关于书签 Eclipse 中可以在编辑器的任意一行添加书签. 您可以使用书签作为提示信息,或者使用书签快速定位到文件中的指定的行. 添加书签 如果你想设置书签,你只需要在垂直 ...

  3. 回调函数(callback)是什么?

    你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给 ...

  4. struts2之constant 讲解 (转)

    struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容.当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false. stru ...

  5. VC++ 汇编相关的东西

    Tips: VC++在新建一个.asm文件后必须重新导入project中才能进行编译. 下面是一个汇编与C++相互调用的例子: Main.cpp #include <stdio.h> #i ...

  6. Ubuntu下MongoDB的安装和使用

    本博文介绍了MongoDB,并详细指引读者在Ubuntu下MongoDB的安装和使用.本教程在Ubuntu14.04下测试通过.(2017.09.07) 安装MongoDB MongoDB安装很简单, ...

  7. python学习【第十一篇】网络编程

    一.socket的简介 socket(简称:套接字)进程间通信的一种方式,它与其他进程间通信的一个主要不同是:能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通 ...

  8. hdu5125(LIS)

    相当于用多个O(nlog(n))LIS来做. // // main.cpp // 160322 // // Created by 陈加寿 on 16/3/22. // Copyright © 2016 ...

  9. 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)

    [BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...

  10. Splitting Pile

    Splitting Pile Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Snuke a ...