GoLang之网络并发编程

本文介绍了Go语言如何通过协程和线程等待组实现并发处理,展示了在处理网络请求时如何通过Go的特性减少6秒延迟,提升性能。重点讲解了并发控制在避免程序错误和系统崩溃中的作用,并提供了两个示例来说明Go的并发解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

网络程序性能比较差、网络流量高时容易发生并发问题。并发涉及进程、线程的执行,以及CPU对进程、线程的调度等问题,如果没有控制好并发的应对处理,可能造成程序执行错误(如超卖、支付数据错误等严重问题),也会造成网站系统瘫痪等问题。因此并发问题需要对程序的优化、系统调优处理。Go语言自身性能优良、以及提供协程、消息队列等特性,可以有效应对并发问题。

参考

Go语言基础可参看:《Go语言入门及技术指南》 https://blog.youkuaiyun.com/yan_dk/article/details/110557155

《GoLang之网络基本编程》https://blog.youkuaiyun.com/yan_dk/article/details/117621468

示例

示例(协程)

需求:业务程序中存在同时调用redis、mysql、文件处理的逻辑,假设redis需要1秒,mysql需要2秒,文件处理需要3秒,按传统的网络请求处理需要6秒,如何优化?

方案:使用GoLang的协程处理。

程序01/main.go

package main

import (
	"fmt"
	"time"
)
func redis()  {
	fmt.Println("start redis")
	time.Sleep(time.Second*1)
	fmt.Println("redis execting...")
	fmt.Println("end redis")
}
func mysql()  {
	fmt.Println("start mysql")
	time.Sleep(time.Second*2)
	fmt.Println("mysql execting...")
	fmt.Println("end mysql")
}

func file()  {
	fmt.Println("start file")
	time.Sleep(time.Second*3)
	fmt.Println("file execting...")
	fmt.Println("end file")
}
func  main()  {
	fmt.Println(time.Now())
	//time.Sleep(time.Second*6)
	go redis()
	go mysql()
	go file()
	time.Sleep(time.Second*3)//主进程设置延时,不然执行过快,看不到线程的输出内容
	fmt.Println(time.Now())

}

运行结果

耗时3秒,性能提高一倍。

程序02/main.go(使用线程等待组方式)

package main

import (
	"fmt"
	"sync"
	"time"
)
//使用线程等待组
var wg sync.WaitGroup
func redis()  {
	defer wg.Done() // 结束登记
	fmt.Println("start redis")
	time.Sleep(time.Second*1)
	fmt.Println("redis execting...")
	fmt.Println("end redis")
}
func mysql()  {
	defer wg.Done() // 结束登记
	fmt.Println("start mysql")
	time.Sleep(time.Second*2)
	fmt.Println("mysql execting...")
	fmt.Println("end mysql")
}

func file()  {
	defer wg.Done() // 结束登记
	fmt.Println("start file")
	time.Sleep(time.Second*3)
	fmt.Println("file execting...")
	fmt.Println("end file")
}
func  main()  {
	fmt.Println(time.Now())
	//time.Sleep(time.Second*6)
	wg.Add(1) // 登记协程
	go redis()
	wg.Add(1) // 登记协程
	go mysql()
	wg.Add(1) // 登记协程
	go file()
	//time.Sleep(time.Second*3)
	wg.Wait() // 等待登记的协程执行完再执行后续的程序
	fmt.Println(time.Now())

}

运行 结果同上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云焰

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值