赞
踩
首先就是进程、线程、协程讲解老三样。
进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位。
线程: 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制。
协程: 又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换,协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程就叫协程,一个线程可以多个协程,线程进程都是同步机制,而协程则是异步Java的原生语法中并没有实现协程,目前python、Lua和GO等语言支持。
关系:一个进程可以有多个线程,它允许计算机同时运行两个或多个程序。线程是进程的最小执行单位,CPU
的调度切换的是进程和线程,进程和线程多了之后调度会消耗大量的CPU,CPU上真正运行的是线程,线程可
以对应多个协程。
golang协程
Go协程中有三个关键实体:
Go协程的特点
(1)有独立的栈空间
(2)共享程序的堆空间
(3)协程调度由用户控制(进程的控制是有操作系统控制,程序员不能控制)
(4)协程是轻量级的线程
Go语言中的通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。
通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。
当然协程的轻量性并不代表可以随意滥用,毕竟还是存在资源的消耗。本文主要讲解go的协程池的实现原理,利用select来监听任务。【代码仅用作实现原理,想更优雅可以在该原理基础上自行优化】
废话不多说直接上代码!
- package main
-
- import (
- "strconv"
- "time"
- )
-
- /**
- 协程池
- */
- //全局任务管道地址数组
- var arr []*chan func()
- //启动任务数量
- var num = 10
- //默认管道下标0
- var index = 0
- //任务开关
- var static = false
- func run(f *chan func()){
- println("等待咯")
- for static == true {
- select {
- case fu:=<-*f : // 检测有没有数据可读
- // 一旦成功读取到数据,则进行该case处理语句
- fu()
- default:
- //println(f)
- //println("无数据")
- }
- time.Sleep(time.Duration(1)*time.Second)
- }
- }
- //启动任务函数
- func Start(){
- static = true
- for i:=0;i<num;i++ {
- //make一个管道地址
- c:=make(chan func(),1)
- println(&c)
- //将该地址存入全局数组中
- arr = append(arr,&c)
- //地址传入任务函数
- go run(&c)
- }
- }
- //插入任务
- func add(str string) {
- //此处不是很优雅,自行优化实现。
- if(index >= num-1){
- index = 0
- }else{
- index++
- }
- //向地址管道传入函数
- *arr[index] <- func() {
- println(str)
- }
- }
- //停止任务
- func stop() {
- //终止任务for
- static = false
- //清空管道数组
- arr = []*chan func(){}
- }
- func main() {
- Start()
- println("开始执行写入管道")
- println(len(arr))
- for i:=0;i<1000000000;i++ {
- add("传入的i:"+strconv.Itoa(i))
- }
- time.Sleep(time.Duration(2)*time.Second)
- stop()
- //time.Sleep(time.Duration(100)*time.Second)
- }

原理很简单,就是合理使用select来监听管道是否有数据,协程池的实现就是合理利用管道。可以根据该思路来进行优化封装一个属于自己的协程池哦~
对于优化建议,有牛可评论,相互学习!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。