go并发(进程、线程、协程)

2023-09-15 15:11:20

背景

        go强大的多线程能力很强大,能并发处理大量的任务。

详细案例分类

        主要介绍go中的进程、线程、协程这三个东西。它们的关系按照内存大小的关系依次是进程 > 线程 > 协程(一般一个协程2K)。

进程

        进程基本上是一个正在执行的程序,它是操作系统中最小的资源分配单位。比如电脑上运行的一个软件就是一个进程。
        go开启进程的方式有三种,本质上都是通过命令去启动电脑上的软件比如nodejs。

package utils

import (
	"fmt"
	"io"
	"os"
	"os/exec"
	"syscall"
)

func Process() {
	// 创建进程方式一
	grepCmd := exec.Command("node", "-v") // cmd命令
	grepIn, _ := grepCmd.StdinPipe()      // 写入管道
	grepOut, _ := grepCmd.StdoutPipe()    // 输出管道
	grepCmd.Start()                       // 开始执行命令
	grepIn.Write([]byte("写入的数据"))         // 写入的数据
	grepIn.Close()                        // 关闭写入通道
	grepBytes, _ := io.ReadAll(grepOut)   // 读取输出的数据
	grepCmd.Wait()                        // 等待进程进程
	fmt.Println("> grep hello, pid: ", grepCmd.Process.Pid)
	fmt.Println(string(grepBytes))

	// 创建进程方式二
	nodeCmd := exec.Command("node", "-v")
	cmdOutput, err := nodeCmd.Output()
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(cmdOutput, string(cmdOutput)) // buffer转utf8
	}

	binary, lookErr := exec.LookPath("node")
	if lookErr != nil {
		panic(lookErr)
	}
	args := []string{"node", "-v"}
	env := os.Environ()
	execErr := syscall.Exec(binary, args, env)
	if execErr != nil {
		panic(execErr)
	}

	println("process进程")
}

线程(轻量级进程)

        线程可以看成是轻量级的进程,线程内存大小会根据处理器进行自动分配。
        其中根据go的两种gc方式cgo和go线程数量是不同的,其中cgo会释放掉空闲的线程提高性能,比如有用到的net包中的LookupHost方法。
        go:GODEBUG=netdns=go go run main.go
        cgo:GODEBUG=netdns=cgo go run main.go

package utils

import (
	"fmt"
	"runtime"
	"runtime/pprof"
	"sync"
)

var threadProfile = pprof.Lookup("threadcreate")

func ThreadTest() {
	fmt.Printf(("线程数%d个"), threadProfile.Count())

	var wg sync.WaitGroup
	wg.Add(10) // 计时器如果为0则所有Wait上阻塞的协程都会释放,为负数则会panic
	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			println("执行任务")
			runtime.LockOSThread() // 杀掉线程(如果协程在退出的时候没有unlock这个线程,那么这个线程会被终止)
		}()
	}
	wg.Wait() // 等待线程执行结束
	fmt.Printf(("线程数%d个"), threadProfile.Count())
	println("thread线程")
}

协程(轻量级线程)

        这里就和channel(https://blog.csdn.net/qq_40816649/article/details/132898741?spm=1001.2014.3001.5501)一起说吧,协程可以看成是轻量级线程,go多线程能力强处理并发靠的就是协程。
        在go中启动一个协程很简单在方法前面加上go关键词,就会启动一个runtime运行函数和当前的go线程不在用一个线程,所以这里为了数据安全go提倡通过通信(channel)共享内存而不是通过共享内存而实现通信。

package utils

import (
	"fmt"
	"time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
	for j := range jobs {
		fmt.Println("worker", id, "processing job", j)
		time.Sleep(time.Second)
		results <- j * 2
	}
}
func Goroutine() {
	jobs := make(chan int, 100)
	results := make(chan int, 100)
	for w := 1; w <= 3; w++ {
		// go关键词启动一个新的runtime运行函数worker(和当前的go线程不在同一个栈)(协程)
		go worker(w, jobs, results)
	}
	for j := 1; j <= 9; j++ {
		jobs <- j
	}
	for a := 1; a <= 9; a++ {
		<-results
	}
	println("goroutine轻量级线程也叫协程")
}

结论

        go的学习之路还很长期望后续工作中能碰到go的应用场景。

所谓的弱,就是一种罪,所谓理想,只是同时拥有实力的人才能说的“现实”

更多推荐

深圳企业智荟康亮相深圳教装展,大力推动校园健康午休工程

2023年9月15日上午,第五届深圳教育装备博览会在深圳(福田)会展中心隆重开幕。本届教博会以“数字赋能·先行示范”为主题,这场盛会吸引了来自全国各地的众多教育界人士和专业观众。主办方介绍,本次展会将有效推动教育装备领域的技术革新和产业升级,将继续引领行业风向,加速促进产业融合,为各级各类教育机构和教育装备企业提供新技

Python爬虫技术系列-01请求响应获取-urllib库

Python爬虫技术系列-01请求响应获取-urllib库1urllib库1.1urllib概述1.1.1urllib简介1.1.2urllib的robotparser模块1.1.3request模块1.1.4Error1.1.5parse模块1.2urllib高级应用1.2.1Opener1.2.2代理设置1urll

2023常用的原型设计软件推荐

美观易操作的产品原型可以帮助团队构建积极的用户体验,帮助团队理解产品交互逻辑。因此,可互动、易修改的产品原型设计对产品的点击率和回访率具有重要意义。选择专业的产品原型设计工具,可以为团队和企业带来高效的产品设计体验。本文选择了四种产品原型设计工具,可以为实际工作带来方便。让我们看看。即时设计即时设计是国内首款专业级的U

SpringBoot

SpringBoot1.概念和介绍Spring用于简化Java程序的开发,而SpringBoot为了简化Spring程序开发。SpringBoot是Spring脚手架。可以快速完成Java程序的创建、提高开发效率等。SpringBoot的优点:快速集成框架,提供启动依赖的功能,可以集成各种框架。内置了运行容器、无需配置

酷开科技,让家庭娱乐生活充满激情

近几年,随着智能电视在家庭生活中的广泛应用,让人们的家庭娱乐生活有了更多的选择,但随之而来的是消费者的需求也在不断地升级,个性化、细分化的需求趋势越加凸显。而酷开科技正是抓住了这个机遇,不断赋能家庭娱乐生活场景,获得了更多消费者的青睐。与此同时,酷开科技凭借自身包容的开放生态体验,以及为消费者提供更丰富、更多元的内容,

C++实现观察者模式(包含源码)

文章目录观察者模式一、基本概念二、实现方式三、角色四、过程五、结构图六、构建思路七、完整代码观察者模式一、基本概念观察者模式(又被称为模型(Model)-视图(View)模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供

网络编程.

网络编程就相当于通过网络进行数据的传输,可以传给别人,不仅限于自己;常见软件架构BS优点1.不需要开发客户端,只需要页面+服务器2.不用下载缺点如果应用过大cs优点1.画面精美缺点1.客户端,服务端都要开发三要素:IP设备在网络中的地址,是唯一的标识端口号应用程序在设备中唯一的标识协议数据在网络中传输的规则,常见的协议

解锁网络世界的利器:代理IP与Socks5代理

随着跨界电商、爬虫、网络安全和游戏等领域的不断发展,网络工程师们正面临着越来越多的挑战和机会。在这个信息爆炸的时代,如何更有效地访问、保护和探索网络资源成为了网络工程师们的首要任务。本文将重点介绍代理IP和Socks5代理,它们是网络世界的利器,为网络工程师提供了强大的工具来应对各种技术挑战。代理IP的妙用代理IP是一

海外代理IP是什么?如何使用?

一、海外代理IP是什么?首先,代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器,被称为“中介”,因为它位于最终用户和他们在线访问的网页之间。海外IP代理是就是指从海外地区获取的IP地址,用于将互联网连接路由通过位于不同国家或地区的服务器。这种代理服务允许用户隐藏其真实的地理位置,并获得访问其他国家或

HTTP Tunnel与后门攻击

后门攻击是指利用隐藏在系统中的漏洞或者特殊设计,以获取未授权的访问权限或者绕过安全控制的攻击方式。通过后门攻击,攻击者可以在受感染的系统上进行非法操作、窃取敏感信息或者控制系统。后门攻击可以采用多种形式,其目的都是为了绕过安全机制并获取非法访问权限。主要形式的后门攻击有以下几种:软件后门:攻击者在软件中嵌入恶意代码或漏

预防API漏洞简述

随着对网络应用程序和数字平台的日益依赖,应用程序编程接口(API)的使用变得越来越流行。如果你不熟悉这个术语,API允许应用程序相互通信,它们在现代软件开发中发挥着至关重要的作用。然而,API使用量的增加也导致了API违规数量的增加。当未经授权的个人或系统访问API及其包含的数据时,就会发生这些违规行为。受害者可以证明

热文推荐