Go简单实现协程池

这篇具有很好参考价值的文章主要介绍了Go简单实现协程池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先就是进程、线程、协程讲解老三样。

进程: 本质上是一个独立执行的程序,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位。

线程: 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程执行不同的任务,切换受系统控制。


协程:  又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换,协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程就叫协程,一个线程可以多个协程,线程进程都是同步机制,而协程则是异步Java的原生语法中并没有实现协程,目前python、Lua和GO等语言支持。


关系:一个进程可以有多个线程,它允许计算机同时运行两个或多个程序。线程是进程的最小执行单位,CPU
的调度切换的是进程和线程,进程和线程多了之后调度会消耗大量的CPU,CPU上真正运行的是线程,线程可
以对应多个协程。

Go简单实现协程池

 golang协程

MPG模型

Go协程中有三个关键实体:

  • M(machine): 工作线程,由操作系统调度。应该就是通常所说的内核线程。
  • P(processor): 处理器(非CPU),代表着运行Go代码的必要资源,以及调度goroutine的能力。个人觉得可以当作拥有自主调度权的算法模块,用于工作窃取(work stealing)
  • G(gooutine): Go协程,轻量级用户线程。主要包含执行栈调度管理器。这里的调度管理器指的是,统一并管理调度资源,等待被调度。

Go简单实现协程池

 

Go协程的特点

(1)有独立的栈空间

(2)共享程序的堆空间

(3)协程调度由用户控制(进程的控制是有操作系统控制,程序员不能控制)

(4)协程是轻量级的线程

Go简单实现协程池

 

通道的特性

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来监听管道是否有数据,协程池的实现就是合理利用管道。可以根据该思路来进行优化封装一个属于自己的协程池哦~

对于优化建议,有牛可评论,相互学习!文章来源地址https://www.toymoban.com/news/detail-480566.html

到了这里,关于Go简单实现协程池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是进程、线程、协程

    我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上

    2024年02月13日
    浏览(37)
  • 进程,线程,协程

    1、进程 进程是具有一定独立功能的程序关于某个​​数据集​​合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销

    2024年02月11日
    浏览(47)
  • golang协程池(goroutine池)ants库实践

     golang中goroutine由运行时管理,使用go就可以方便快捷的创建一个goroutine,受限于服务器硬件内存大小,如果不对goroutine数量进行限制,会出现Out of Memory错误。但是goroutine泄漏引发的血案,想必各位gopher都经历过,通过协程池限制goroutine数一个有效避免泄漏的手段,但是自

    2024年02月13日
    浏览(48)
  • Linux的进程,协程和线程

    Linux的进程、协程和线程是计算机科学中重要的概念,它们在操作系统和并发编程中发挥着关键的作用。让我们逐个详解这些概念,并讨论它们之间的关系。 进程是操作系统中的一个执行单元,它包含了程序执行所需的所有资源,如内存空间、文件描述符、寄存器等。 进程是

    2024年01月23日
    浏览(45)
  • 1.Unity协程、进程、线程的区别

    1、 进程 拥有自己独立的堆和栈,堆和栈都不共享,进程由操作系统调度。 2、 线程 有自己独立的栈和共享的堆,栈不共享,堆共享,标准的线程也是由系统调度。 3、 协程 有自己独立的栈和共享的堆,栈不共享,堆共享,协程由程序员在协程的代码里面调度。 协程多与线

    2024年02月03日
    浏览(47)
  • Python多任务教程:进程、线程、协程

    进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进

    2024年02月12日
    浏览(41)
  • 【Python】多线程编程 ① ( 线程相关概念 | 进程 | 线程 | 协程 / 纤程 | 管程 )

    进程 与 操作系统 : 进程 是 操作系统 中 能够独立运行的单元 , 是 操作系统 对 正在运行的 应用程序 的 抽象结构 描述 ; 操作系统 中 运行的每个 应用程序 就是一个进程 ; 一个操作系统中可以运行 多个 进程 ; 每个 应用程序 都会被 操作系统 分配一个 进程 ID ; 多个进程之间

    2024年02月15日
    浏览(38)
  • 多线程、协程和多进程并发编程

    37.1 如何通俗理解线程和进程? 进程:进程就是正在执⾏的程序。 线程:是程序执⾏的⼀条路径, ⼀个进程中可以包含多条线程。 通俗理解:例如你打开抖⾳,就是打开⼀个进程,在抖⾳⾥⾯和朋友聊天就是开启了⼀条线程。 再举⼀个例⼦: 在某⻝堂打饭的时候,此⻝堂安

    2024年02月02日
    浏览(99)
  • 【Python爬虫与数据分析】进程、线程、协程

    目录 一、概述 二、进程的创建 三、线程的创建 四、协程的创建 五、全局变量的共享问题 六、消息队列与互斥锁 七、池化技术 进程是系统分配资源的基本单位,线程是CPU调度的基本单位。 一个进程可包含多个线程,一个线程可包含多个协程,协程就是最小的任务执行单位

    2024年02月13日
    浏览(41)
  • [Python系列] 线程、协程、进程和分布式

            我们在写脚本的时候,经常是单线程跑完了全部,毕竟自顶向下按照我们约定的方法运行下去是最规范的。但是很多时候,比如说合法地爬取一些网页信息,图片和资料啊,或者说一些合法的网络请求,读写文件之类的。如果还是单线程地one by one,那么将会影响我们

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包