go并发编程以及socket通信的理解

news/2024/9/23 8:54:00/

go并发编程以及socket通信的理解

文章目录

  • go并发编程以及socket通信的理解
    • 一、管道的简单使用
    • 二、go中的socket实现通信

一、管道的简单使用

" golang不是通过共享内存来通信,而是通过通信来共享内存 "

1、go简单初始化

// golang不是通过共享内存来通信,而是通过通信来共享内存
func a1() {// 声明初始化 channelvar ch chan string = make(chan string) // deadlock 会造成死锁,因为我们的管道是没有缓冲的// 内置的make函数有什么作用?// make 初始化内存,并且返回引用类型本身// new 只是将内存清零,返回的是指向类型的指针ch <- "hello" //阻塞写str := <-ch   //阻塞读fmt.Println(str)// 单向channelvar ch1 chan<- string // 只能写var ch2 <-chan string // 只能读// 关闭channelclose(ch1)x, ok := <-ch2if ok {fmt.Println(x)} else {fmt.Println("channel is closed")}
}

2、用 select 做一个简单的超时管理

	// Go语言直接引入select关键字,用于处理异步问题var ch1, ch2 chan stringselect {case x := <-ch1: // 如果从ch1读取数据,那么执行此语句fmt.Println(x)case y := <-ch2: // 如果从ch2读取数据,那么执行此语句fmt.Println(y)default:fmt.Println("default")}

超时管理:

func download(ch chan string) {for i := 1; i < 10; i++ {fmt.Println(i)time.Sleep(time.Second * 1)}ch <- "ok"
}
func a2() {// 超时处理timeout := make(chan int, 1)go func() {time.Sleep(time.Second * 3)timeout <- 1 // 用来标记超时,可以是任何非0值}()ch := make(chan string, 6) // 用于从download中接受数据go download(ch)select {case <-ch:fmt.Println("从ch中读取数据,执行正常业务处理") // 如果从ch中读取到数据那么正常处理业务case <-timeout:fmt.Println("3秒内没有从ch中读取数据,执行超时处理")// 如果从timeout中读取到数据,那么download执行超时}
}

3、编程体:通过go协程输出100个以内的任意两个数之和,减少等待。

func add(i, x, y int) {fmt.Printf("%d + %d = %d\n", x, y, x+y)
}
func a3() {for i := 1; i <= 100; i++ {x := rand.Intn(100)time.Sleep(time.Millisecond)y := rand.Intn(100)go add(i, x, y)}
}

二、go中的socket实现通信

知识速记

// 共享数据机制-sync
func s1() {// sync.Mutex//mutex := sync.Mutex{}}// 上下文机制 - Context// socket 原理
/*互联网TCP/IP四层模型四层:数据层(帧)、网络层(IP)、传输层(TCP/UDP)、应用层(HTTP)通信:封包和解包抽象:应用程序到应用程序、进程到进程、主机到主机、设备到设备*/

1、代码示例clinet.go和server.go

clinet.go

package main
import ("bufio""fmt""net""time"
)
func main() {// 与服务端建立连接conn, err := net.DialTimeout("tcp", "127.0.0.1:8899", time.Second)if err != nil {fmt.Printf("dial failed, err:%v\n", err)return}defer conn.Close()// 要发送的数据msg := []string{"hello world!", "golang", "c++", "python"}//  通过bufio方式发送writer := bufio.NewWriter(conn)for i, v := range msg {n, err := writer.Write([]byte(v))writer.Flush()if err != nil {fmt.Printf("write failed, err:%v\n", err)return}fmt.Printf("%d: write %d,bytes, data:%s\n", i, n, v)time.Sleep(time.Second)}
}

server.go

// go 基于 socket 的 tcp 编程
func HandleConn(conn net.Conn) {fmt.Println("accepted a new connection!")defer conn.Close()for {// 负责缓存接受的数据buf := make([]byte, 32)n, err := conn.Read(buf) //表面上是 阻塞读if err != nil {fmt.Println("read err:", err)break}if n == 0 {continue}// 打印客户端发送的数据fmt.Printf("recv client data: %s\n", string(buf[:n]))// 发送数据给客户端conn.Write([]byte("hello client"))}
}
func main() {// 开始监听 8899 端口listen, err := net.Listen("tcp", ":8899")if err != nil {fmt.Println("listen err:", err)return}// 循环接受连接for {conn, err := listen.Accept()if err != nil {fmt.Println("accept err:", err)break}// 处理连接go HandleConn(conn)}
}

2、go基于 socket 的 tcp 编程

1、连接建立问题
连接拒绝:网络ping不通、ip或port指定错误、server未启动
listen backlog:增大server端listen backlog队列
网络延迟较大
2、读数据问题
无数据可读:goroutine阻塞即可
数据不足
超时
3、写数据问题
写阻塞
写入部分数据
4、线程安全问题


http://www.ppmy.cn/news/1426048.html

相关文章

机器学习方法在测井解释上的应用-以岩性分类为例

机器学习在测井解释上的应用越来越广泛&#xff0c;主要用于提高油气勘探和开发的效率和精度。通过使用机器学习算法&#xff0c;可以从测井数据中自动识别地质特征&#xff0c;预测岩石物理性质&#xff0c;以及优化油气储层的评估和管理。 以下是机器学习在测井解释中的一些…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

python爬虫之爬取携程景点评价(5)

一、景点部分评价爬取 【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略指南 (ctrip.com) import requests from bs4 import BeautifulSoupif __name__ __main__:url https://m.ctrip.com/webapp/you/commentWeb/commentList?seo0&businessId22176&busines…

阿药陪你学Java(第三讲)

第三讲&#xff1a;输入和输出 Java中的输入和输出是用户可以直观的和程序进行交互的一种方式。 所谓输出就是程序打印信息&#xff0c;比如打印计算结果到控制台显示&#xff1b;输入就是用户手动提供给程序某些数据&#xff0c;比如根据程序提示从控制台输入数字或字符串等…

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

Java作业6-Java类的基本概念三

编程1 import java.util.*;abstract class Rodent//抽象类 {public abstract String findFood();//抽象方法public abstract String chewFood(); } class Mouse extends Rodent {public String findFood(){ return "大米"; }public String chewFood(){ return "…

Windows如何下载Bun并在前端Vue或React项目上替代Yarn或Npm

Bun Bun网站 Bun 在 Windows 上下载并安装 Bun 非常简单。你可以使用以下命令在 Windows 10 或更高版本上安装 Bun powershell -c "irm bun.sh/install.ps1 | iex"“powershell”不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 PowerShell 命令解决…

【C++风云录】五款 C++ 库的探索与应用:物联网、嵌入式与数据处理

提升你的C技能&#xff1a;五个关键库的使用与指南 前言 在今天的数字化世界里&#xff0c;C 作为一种强大且快速的编程语言&#xff0c;在各类复杂系统和应用的开发中扮演着重要角色。然而&#xff0c;单凭语言本身的能力&#xff0c;我们往往无法实现所有的功能需求&#x…