返回顶部
首页 > 资讯 > 后端开发 > GO >golang的串行处理和并行处理有什么区别
  • 951
分享到

golang的串行处理和并行处理有什么区别

2023-06-20 15:06:11 951人浏览 八月长安
摘要

这篇文章主要介绍“golang的串行处理和并行处理有什么区别”,在日常操作中,相信很多人在Golang的串行处理和并行处理有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang的串行处理和并行处

这篇文章主要介绍“golang的串行处理和并行处理有什么区别”,在日常操作中,相信很多人在Golang的串行处理和并行处理有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang的串行处理和并行处理有什么区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

程序运算时往往需要数据,而数据的io又往往需要时间传输,而常见的串行处理,是一个任务处理完成才接着处理新的任务, 其效率低下可想而知。 假如有3个任务要处理,而每个任务都有一定的阻塞,串行处理大概是这个样子:

main.go

package mainimport (    "fmt"    "time")type Task struct {    Duration time.Duration    Name string}func main() {    // 声明要处理的任务    taskList := []Task {        {            1,            "处理1",        },        {            2,            "处理2",        },        {            3,            "处理3",        },    }    starTime := time.Now().Unix()    for _, item := range taskList {        goProcess(item)    }    fmt.Printf("用时:%ds\n", time.Now().Unix() - starTime)}func goProcess(task Task) {    time.Sleep(time.Second * task.Duration) // 假设这是io阻塞会在这里阻塞一些时间,而这些io可能是网络io也可能是磁盘io等,io完成后才会接着运行下去    fmt.Printf("任务:%s 处理完毕\n", task.Name)}

处理打印结果
任务:处理1 处理完毕
任务:处理2 处理完毕
任务:处理3 处理完毕
用时:6s

这种串行处理遇到IO阻塞时,弊端就是太费时间了

可以看到,程序在计算时或许用不到多少时间反而是IO阻塞占用了大量的时间。这种占着茅坑不拉屎,外面等着人直跳脚,确实不太好。而用异步处理则可以跳过阻塞,达到避免占坑的情况发生。

用协程的话,则可以在阻塞时先异步执行下去而不用等待,等所有协程都处理结束,再把处理的结果汇总起来就可以了,代码大概是这样子:

main.go

package mainimport (    "fmt"    "sync"    "time")type Task struct {    Duration time.Duration    Name string}func main() {    // 声明要处理的任务    taskList := []Task {        {            1,            "处理1",        },        {            2,            "处理2",        },        {            3,            "处理3",        },    }    starTime := time.Now().Unix()    var res []string //处理结果收集    resChang := make(chan string, len(taskList))    wg := &sync.WaitGroup{}    // 这里收集异步处理的结果, 通过管道把数据传递过来,类似于单一订阅功能吧    go func() {        wg.Add(1)        defer wg.Done() // 通道关闭后 处理结果也收集完毕,则触发 用于通知下方批处理,处理结果已经收集完毕        for resItem := range resChang {            res = append(res, resItem)        }    }()    taskWG := &sync.WaitGroup{}    for _, item := range taskList {        taskWG.Add(1) // 批处理 信号量+1        go goProcess(item, &resChang, taskWG)    }    taskWG.Wait()// 这里阻塞,等待所有处理执行完毕, 才接着运行下去    close(resChang)// 已经处理完毕后就关闭处理传输通道    wg.Wait() // 这是阻塞 等待处理收集完毕, 才接着运行去    // 打印批处理收集的处理结果    for _, i := range res {        fmt.Printf("%s", i)    }    fmt.Printf("用时:%ds\n", time.Now().Unix() - starTime)}func goProcess(task Task, resChan *chan string, taskWG *sync.WaitGroup) {    time.Sleep(time.Second * task.Duration) // 假设这是io阻塞会在这里阻塞一些时间,而这些io可能是网络io也可能是磁盘io等,才会接着运行下去    res := fmt.Sprintf("任务:%s 处理完毕\n", task.Name)    defer func() {        *resChan <- res // 把处理结果传出去        taskWG.Done() // 批处理信号量-1 来报告处理完毕    }()}

运行结果
任务:处理1 处理完毕
任务:处理2 处理完毕
任务:处理3 处理完毕
用时:3s

相对于之前的串行,这次的并行有效处理IO的阻塞,相当于,串行就是占坑不用的角,并行则不管这些,你不用,先把你踹开,给有需要的人用先,这样一脚脚的踹,效率就上一来了。

到此,关于“golang的串行处理和并行处理有什么区别”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: golang的串行处理和并行处理有什么区别

本文链接: https://lsjlt.com/news/297582.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • golang的串行处理和并行处理有什么区别
    这篇文章主要介绍“golang的串行处理和并行处理有什么区别”,在日常操作中,相信很多人在golang的串行处理和并行处理有什么区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang的串行处理和并行处...
    99+
    2023-06-20
  • golang的串行处理和并行处理区别
    程序运算时往往需要数据,而数据的IO又往往需要时间传输,而常见的串行处理,是一个任务处理完成才接着处理新的任务, 其效率低下可想而知。 假如有3个任务要处理,而每个任务都有一定的阻塞...
    99+
    2024-04-02
  • php异常处理和错误处理有什么区别
    PHP异常处理和错误处理之间有一些区别。1. 异常处理是一种更高级别的错误处理机制,允许程序捕获和处理运行时错误,而不会导致程序终止...
    99+
    2023-08-29
    php
  • JavaScript中Promise处理异步的并行与串行
    目录一、异步的“并行” 并行中的综合处理二、异步的“串行”:2.1 then链机制处理2.2 真实项目中,想实现异步的串行,...
    99+
    2022-12-19
    promise串行和并行 js promise的用法总结 promise串行执行
  • JavaScript中Promise如何处理异步的并行与串行
    这篇“JavaScript中Promise如何处理异步的并行与串行”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaSc...
    99+
    2023-07-04
  • 什么是Teradata的并行处理架构
    Teradata的并行处理架构是一种数据仓库架构,它采用了共享-nothing架构。在这种架构下,数据被分割成多个部分,每个部分被存...
    99+
    2024-04-09
    Teradata
  • Java并行处理的实现
    目录1. 背景2.知识3. Java 中的并行处理4. 扩展线程池方式实现并行处理使用 fork/join框架5.参考:1. 背景 本文是一个短文章,介绍Java 中的并行处理。 ...
    99+
    2024-04-02
  • Oracle数据库中的并行处理是什么
    在Oracle数据库中,并行处理是指将一个查询或操作分成多个部分,并同时在多个处理器或服务器上执行这些部分,以加快查询或操作的执行速...
    99+
    2024-03-02
    Oracle
  • Golang并发编程指南:探索并行处理的奥秘
    go中并发编程利用轻量级线程(goroutine)和通信机制(管道)来实现并行任务执行。同步原语(如互斥体)用于协调goroutine之间的访问。实战案例包括创建高效的并发web服务,以...
    99+
    2024-05-12
    golang 并发编程 go语言
  • JavaScript怎么处理并行请求
    这篇文章主要讲解了“JavaScript怎么处理并行请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript怎么处理并行请求”吧!需求两个异步...
    99+
    2024-04-02
  • Teradata怎么支持并行处理
    Teradata是一种并行处理数据库管理系统(PDBMS),它支持并行处理通过以下方式实现: Shared-nothing架构:...
    99+
    2024-04-09
    Teradata
  • js异步处理方案,js的异步串行与异步并行
    目录js异步处理方案,js的异步串行与异步并行一、什么是串行,并行,并发二、实现异步串行三、实现异步并行js异步处理方案,js的异步串行与异步并行 一、什么是串行,并行,并发 串行:...
    99+
    2023-03-24
    javascript异步处理 js异步串行与并行
  • Go中并发和并行的区别有哪些
    这篇文章主要介绍了Go中并发和并行的区别有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go中并发和并行的区别有哪些文章都会有所收获,下面我们一起来看看吧。并发和并行的区别:1、并发是把任务在不同的时间点交...
    99+
    2023-07-05
  • Golang 函数如何高效处理并行任务
    go 函数中的高效并行任务处理:使用 go 关键字启动并发例程。使用 sync.waitgroup 计数未完成例程的数量。例程完成时调用 wg.done() 递减计数器。主程序使用 wg...
    99+
    2024-04-19
    并发 并行 golang
  • PHP开发中如何处理任务并行和轮询处理
    在实际的PHP开发中,处理任务的并行性和轮询性是非常常见且重要的操作。本文将介绍如何在PHP中处理任务的并行执行以及轮询处理,同时提供具体的代码示例。一、任务并行处理任务并行处理是指多个任务同时进行,相互之间不会产生阻塞。在PHP中,有几种...
    99+
    2023-10-21
    并行处理 任务处理 轮询处理
  • java多线程并行处理的方法是什么
    Java中实现多线程并行处理的方法有以下几种:1. 继承Thread类:创建一个继承自Thread类的子类,重写run()方法,在r...
    99+
    2023-09-21
    java
  • 怎么在pandas apply中对并行进行处理
    怎么在pandas apply中对并行进行处理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. pandarallel (pip install )对于一个带有Panda...
    99+
    2023-06-06
  • Python中怎么实现并行处理
    Python中怎么实现并行处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。传统的例子简单搜索下"Python 多线程教程",不难发现几乎所...
    99+
    2023-06-16
  • JavaScript中怎么处理并行请求
    JavaScript中怎么处理并行请求,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、使用Promise.allconst startTime&nb...
    99+
    2023-06-20
  • PHP 和自然语言处理:有什么共性和区别吗?
    自然语言处理(Natural Language Processing,NLP)是一项涉及人工智能和语言学的交叉领域技术,旨在让计算机能够理解、分析、生成自然语言。而 PHP(Hypertext Preprocessor)则是一种流行的服务...
    99+
    2023-09-22
    自然语言处理 load numpy
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作