浅析Go语言中的同步与异步处理

 更新时间:2023年11月07日 09:23:19   作者:洛天枫  
在开发过程中,当需要同时处理多个操作时,开发者经常面临同步和异步两种处理方式的选择,下面小编就来和大家详细介绍一下Go语言中的同步与异步处理吧

同步处理

在同步处理方式中,任务按顺序一个接一个地执行。每个任务必须在下一个任务开始之前完成。这意味着如果某个任务需要花费大量时间来完成,它可能会阻塞后续任务的执行,导致潜在的性能瓶颈。

一个简单的现实生活中的例子是两个人在喝啤酒时进行对话。一个人说一些话并提问,另一个人根据情况回应,然后反过来...

在下面的示例中,每个URL调用必须完成其整个请求-响应周期并提供响应或错误,以便可以进行后续的URL调用。

package main

import (
	"fmt"
	"net/http"
)

func makeUrlCall(url string) {
	_, err := http.Get(url)
	if err != nil {
		fmt.Println("Got error in connecting to url: ", url)
	}

	fmt.Println("Got the response from our url: ", url)
}

func main() {

	fmt.Println("Welcome here !!")
	fmt.Println()

	//slice of urls
	urlSlice := []string{
		"https://www.baidu.com",
		"https://www.csdn.net",
		"https://www.runoob.com",
	}

	for idx, url := range urlSlice {
		fmt.Println("Calling url on index: ", idx)
		makeUrlCall(url)
	}

	fmt.Println()
	fmt.Println("End of sync processing !!")

	return
}

输出:

Welcome here !!

Calling url on index:  0
Got the response from our url:  https://www.baidu.com
Calling url on index:  1
Got the response from our url:  https://www.csdn.net
Calling url on index:  2
Got the response from our url:  https://www.runoob.com

End of sync processing !!

异步处理

在异步处理方式中,任务独立并同时执行。这意味着程序在一个任务完成之前不会等待它继续下一个任务。在Golang中,可以使用Goroutines和Go运行时来实现异步编程。

一个简单的现实生活中的例子是去汽车修理店。一旦工程师处理完其他任务,他们会处理你的任务。在此期间,你可以做其他重要的事情,直到你的汽车被取走并修好。

在下面的示例中,每个URL调用将通过goroutine在自己的线程中进行,并根据需要处理响应。

package main

import (
	"fmt"
	"net/http"
	"sync"
)

func makeUrlCall(url string) {
	_, err := http.Get(url)
	if err != nil {
		fmt.Println("Got error in connecting to url: ", url)
	}

	fmt.Println("Got the response from our url: ", url)
}

func main() {
	fmt.Println("Welcome here !!")
	fmt.Println()

	//slice of urls
	urlSlice := []string{
		"https://www.baidu.com",
		"https://www.csdn.net",
		"https://www.runoob.com",
	}

	var wg sync.WaitGroup

	for _, u := range urlSlice {
		wg.Add(1)
		//all the url's to get error/response are called in their own separate thread via goroutines
		go func(url string) {
			defer wg.Done()

			makeUrlCall(url)
		}(u)
	}

	wg.Wait()

	fmt.Println()
	fmt.Println("End of sync processing !!")

	return
}

输出:

Welcome here !!

Got the response from our url:  https://www.baidu.com
Got the response from our url:  https://www.runoob.com
Got the response from our url:  https://www.csdn.net

End of sync processing !!

如果我们在切片中添加更多的URL并进行更多的HTTP get请求,比较两种方式的性能。

到此这篇关于浅析Go语言中的同步与异步处理的文章就介绍到这了,更多相关Go同步与异步处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang下grpc框架的使用编写示例

    golang下grpc框架的使用编写示例

    这篇文章主要为大家介绍了golang下grpc框架的使用编写示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang如何优雅的编写事务代码示例

    golang如何优雅的编写事务代码示例

    这篇文章主要介绍了golang如何优雅的编写事务代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 一些关于Go程序错误处理的相关建议

    一些关于Go程序错误处理的相关建议

    错误处理在每个语言中都是一项重要内容,众所周知,通常写程序时遇到的分为异常与错误两种,Golang中也不例外,这篇文章主要给大家介绍了一些关于Go程序错误处理的相关建议,需要的朋友可以参考下
    2021-09-09
  • go下载指定版本的依赖包图文详解

    go下载指定版本的依赖包图文详解

    由于依赖包的每个版本都有一个唯一的目录,所以在多项目场景中需要使用同一个依赖包的多版本时才不会产生冲突,下面这篇文章主要给大家介绍了关于go下载指定版本的依赖包的相关资料,需要的朋友可以参考下
    2023-04-04
  • Golang 串口通信的实现示例

    Golang 串口通信的实现示例

    串口通信是一种常见的硬件通信方式,用于在计算机和外部设备之间传输数据,本文主要介绍了Golang 串口通信的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 简单聊聊Go语言中空结构体和空字符串的特殊之处

    简单聊聊Go语言中空结构体和空字符串的特殊之处

    在日常的编程过程中,大家应该经常能遇到各种”空“吧,比如空指针、空结构体、空字符串等,本文就以 Go 语言为例,一起来看看空结构体和空字符串在 Go 语言中的特殊之处吧
    2024-03-03
  • Go语言学习之golang-jwt/jwt的教程分享

    Go语言学习之golang-jwt/jwt的教程分享

    jwt是 json web token的简称。go使用jwt目前,主流使用的jwt库是golang-jwt/jwt。本文就来和大家讲讲golang-jwt/jwt的具体使用,需要的可以参考一下
    2023-01-01
  • 一文搞懂Golang中的内存逃逸

    一文搞懂Golang中的内存逃逸

    我们都知道go语言中内存管理工作都是由Go在底层完成的,这样我们可以不用过多的关注底层的内存问题。本文主要总结一下 Golang内存逃逸分析,需要的朋友可以参考以下内容,希望对大家有帮助
    2022-09-09
  • Golang实现Redis过期时间实例探究

    Golang实现Redis过期时间实例探究

    这篇文章主要介绍了Golang实现Redis过期时间实例探究,
    2024-01-01
  • 解决Go语言time包数字与时间相乘的问题

    解决Go语言time包数字与时间相乘的问题

    这篇文章主要介绍了Go语言time包数字与时间相乘的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论