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

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.mzph.cn/web/956.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯2024年第十五届省赛真题-小球反弹

以下两个解法感觉都靠谱&#xff0c;并且网上的题解每个人答案都不一样&#xff0c;目前无法判断哪个是正确答案。 方法一&#xff1a;模拟 代码参考博客 #include <iostream> #include <cmath> #include <vector>using namespace std;int main() {const i…

(二十)C++自制植物大战僵尸游戏僵尸进攻控制实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs 文件位置 实现功能的代码文件位置在Class\Scenes\GameScene文件夹中&#xff0c;具体如下图所示。 ZombiesAppearControl.h /* 僵尸出现波数控制 */ class ZombiesAppearControl { public:/***对于进攻的不同波数…

【吊打面试官系列】Java高并发篇 - 如何停止一个正在运行的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【如何停止一个正在运行的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 如何停止一个正在运行的线程&#xff1f; java如何停止一个正在运行的线程? 在Java中&#xff0c;可以使用Thread.stop()方法来停止一…

Android自带模拟器如何获得ROOT权限

如果在模拟器中不能切换到root权限&#xff0c;很可能是镜像使用的不对。 一.选择镜像标准&#xff1a; 1.运行在PC端选X86_64镜像&#xff0c;才能流畅运行 2.不带google api的镜像 二.步骤 在虚拟机管理器中新建AVD&#xff0c;并下载符合要求的镜像文件 三.验证

【MATLAB】App 设计 (入门)

设计APP 主界面 函数方法 定时器 classdef MemoryMonitorAppExample < matlab.apps.AppBase% Properties that correspond to app componentsproperties (Access public)UIFigure matlab.ui.FigureStopButton matlab.ui.control.ButtonStartButton matlab.ui.cont…

大模型ChatGPT里面的一些技术和发展方向

文章目录 如何炼成ChatGPT如何调教ChatGPT如何武装ChatGPT一些大模型的其他方向 这个是基于视频 https://www.bilibili.com/video/BV17t4218761&#xff0c;可以了解一下大模型里面的一些技术和最近的发展&#xff0c;基本都是2022你那以来的发展&#xff0c;比较新。然后本文…

SpringMVC 异常没有处理,发送 /error 请求(404 错误)

现象&#xff1a; 在过滤器中进行鉴权时候抛出了异常&#xff0c;此时客户端会收到 404 错误&#xff0c;接口确定是存在&#xff0c;为什么会收到 404 错误呢&#xff1f; {"timestamp": "2024-04-16T03:12:19.83200:00","status": 404,"…

最新版的GPT-4.5-Turbo有多强

OpenAI再次用实力证明了&#xff0c;GPT依然是AI世界最强的玩家&#xff01;在最新的AI基准测试中&#xff0c;OpenAI几天前刚刚发布的GPT-4-Turbo-2024-04-09版本&#xff0c;大幅超越了Claude3 Opus&#xff0c;重新夺回了全球第一的AI王座&#xff1a; 值得一提的是&#xf…

C++ 模板详解——template<class T>

一. 前言 在我们学习C时&#xff0c;常会用到函数重载。而函数重载&#xff0c;通常会需要我们编写较为重复的代码&#xff0c;这就显得臃肿&#xff0c;且效率低下。重载的函数仅仅只是类型不同&#xff0c;代码的复用率比较低&#xff0c;只要有新类型出现时&#xff0c;就需…

LeetCode 34在排序数组中查找元素的第一个和最后一个位置

LeetCode 34在排序数组中查找元素的第一个和最后一个位置 给你一个按照非递减顺序排列的整数数组nums&#xff0c;和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳市场风险的热电联产虚拟电厂低碳调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【.net core】【sqlsugar】批量更新方法

官方文档&#xff1a;单表更新、更新数据 - SqlSugar 5x - .NET果糖网 泛型类中增加 //更新单个实体 public async Task<int> Update(TEntity entity) {//IgnoreColumns(ignoreAllNullColumns: true)&#xff1a;忽略设置为跳过的列return await _db.Updateable(entity…

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 "…

IDEA 编码格式设置 UTF-8

IDEA 编码格式设置 UTF-8 1.文件编码设置为UTF-8 Editor > File Encodings 2.编译编码设置为utf-8 Build&#xff0c;Execution&#xff0c;Deployment > Complier > Java Complier 按图中设置&#xff1a;-encoding utf-8

【数学建模】钻井问题

已知 12口井的坐标位置如下: x[0.50,1.41,3.00,3.37,3.40,4.72,4.72,5.43,7.57,8.38,8.98, 9.50]; y[2.00,3.50,1.50,3.51,5.50,2.00,6.24,4.10,2.01,4.50,3.41,0.80];设平面有n个点 P i P_i Pi​(表旧井井位),其坐标为 ( a i , b i ) , i 1 , 2 , … , n (a_i,b_i),i1,2,…,…

嵌入式学习57-ARM7(字符设备驱动框架led)

kernel 内核 printk 内核打印 cat /proc/devices mknod ? 查看指令 gcc -oapp hello.c

动态库作用举例

1.定义解析 符号地址&#xff1a; 符号地址是指代码中定义的函数、变量或其他标识符的内存地址。在程序编译和链接的过程中&#xff0c;这些符号会被编译器和链接器分配一个具体的内存地址。 每个符号在程序的执行过程中都有一个唯一的地址&#xff0c;用于指示它在内存中的位…

fastapi写一个上传的接口

首先&#xff0c;确保您已经在 Python 环境中安装了 FastAPI。 安装环境&#xff1a; pip install fastapi uvicorn让我们创建一个图片上传的接口&#xff1a; from fastapi import FastAPI, File, UploadFile from fastapi.responses import JSONResponse import shutil im…

Dynamic Wallpaper for Mac:动态壁纸让桌面更生动

Dynamic Wallpaper for Mac是一款为苹果电脑用户精心设计的动态壁纸软件&#xff0c;它以其丰富的功能和精美的壁纸库&#xff0c;为用户带来了更加生动和个性化的桌面体验。 Dynamic Wallpaper for Mac v17.8中文版下载 这款软件支持多种动态壁纸&#xff0c;用户可以根据自己…

AirServer投屏软件

AirServer下载:https://souurl.cn/7xWmKW AirServer是一款功能强大的屏幕镜像接收器&#xff0c;它适用于Mac和PC&#xff0c;允许用户接收来自iOS、Android、Mac和Windows等设备的AirPlay和Google Cast流。这款软件可以让用户将手机或平板电脑的屏幕内容无线投射到电脑上&…