首页 > 其他分享 >GO 协程

GO 协程

时间:2023-06-18 16:33:06浏览次数:34  
标签:协程 并发 使用 go 线程 time GO

转载请注明出处:

  线程是进程中的一个实体,被系统独立调度和分派的基本单位。线程自己不拥有系统资源,只拥有运行中必不可少的资源。同一进程中的多个线程并发执行,这些线程共享进程所拥有的资源。

  协程是一种比线程更加轻量级的存在,重要的是,协程不被操作系统内核管理,协程完全是由程序控制的,不需要手动创建和管理线程,它的运行效率极高。协程的切换完全由程序控制,不像线程切换需要花费操作系统的开销,线程数量越多,协程的优势就越明显。协因为只有一个线程,不存在变量冲突。

   Go 语言中的协程(Goroutine)是一种轻量级线程,可以在单个进程中并发执行,使用协程可以实现高效的并发编程。协程的语法非常简单,只需要在函数或方法前加上 go 关键字即可创建一个协程,例如:
go func(parameter)

  语法格式说明如下:

    1)go代表Go语言关键字,用于实现高并发。

    2)func代表已定义的函数名称,为并发执行提供程序入口。

    3)parameter代表函数参数。

  按照关键字go的语法格式,通过示例说明如何实现Go语言的并发编程,示例如下:

package main
    import (
        "fmt"
        "time"
    )
    func running() {
        // 循环5次
        for i := 0; i < 5; i++ {
             fmt.Println("tick", i)
             // 延时1秒
             time.Sleep(1 * time.Second)
        }
    }
    func main() {
        // 并发执行程序
        go running()
        // 主程序
        for i := 0; i < 5; i++ {
             time.Sleep(1 * time.Second)
             fmt.Println("Waitting for you")
        }
    }

  其运行的结果如图所示:

注意事项:

  1. 不要在协程中使用共享变量,避免出现数据竞争问题。可以使用通道或互斥锁等同步机制来保证协程之间的数据安全。

  2. 不要在协程中使用 panic 函数,因为协程无法像线程一样捕获 panic 异常,可能会导致整个程序崩溃。

  3. 不要创建过多的协程,以避免过度切换和资源浪费。在实际应用中,可以根据实际情况限制协程的数量,或者使用线程池等技术来优化协程的使用。

  4. 尽量避免使用协程的阻塞操作,以充分利用协程的并发性能。可以使用超时机制或者非阻塞的 I/O 操作等技术,来解决协程阻塞的问题。

  5. 注意协程的调度和管理,避免出现死锁、饥饿等问题。可以使用通道等同步机制来协调协程的执行顺序,或者使用调度器等技术来优化协程的调度。 总之,在使用协程进行并发编程时,需要充分理解协程的特点和使用方法,避免出现常见的问题和错误。同时,也需要根据实际情况进行优化和调整,以充分发挥协程的并发性能。

 

 

标签:协程,并发,使用,go,线程,time,GO
From: https://www.cnblogs.com/zjdxr-up/p/17489280.html

相关文章

  • Python第三方模块:pymongo模块的用法
    pymongo模块是python操作mongo数据的第三方模块,记录一下常用到的简单用法。首先需要连接数据库:MongoClient():该方法第一个参数是数据库所在地址,第二个参数是数据库所在的端口号authenticate():该方法第一个参数是数据库的账号,第二个参数是数据库的密码frompymongoimpor......
  • Go 语言之 Viper 的使用
    Go语言之Viper的使用Viper介绍Viper:https://github.com/spf13/viper安装gogetgithub.com/spf13/viperViper是什么?Viper是一个针对Go应用程序的完整配置解决方案,包括12-Factor应用程序。它可以在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:Vi......
  • UnfairSugoroku
    [ABC298E]UnfairSugoroku考虑令\(f[A][B][0/1]\)表示第一/二个人投完,一、二两人数字为\(A,B\)的概率。\[f[A][B][0]=\dfrac{1}{P}\sum_{i=1}^Pf[A-i][B][1]\]\[f[A][B][1]=\dfrac{1}{Q}\sum_{i=1}^Qf[A][B-i][0]\]复杂度\(O((N+P)(N+Q)(P+Q))\)。转移到\(A,B\)中有......
  • C++ STL(algorithm)
    1字符和整数排序#include<iostream>#include<algorithm>usingnamespacestd;voidstl1(){inta[]={-1,9,-34,100,45,2,98,32};intlen=sizeof(a)/sizeof(int);sort(a,a+len);//由小到大排列sort(a,a+len,greater<int>());//由大到小排列}vo......
  • C++ STL(algorithm)
    1字符和整数排序#include<iostream>#include<algorithm>usingnamespacestd;voidstl1(){inta[]={-1,9,-34,100,45,2,98,32};intlen=sizeof(a)/sizeof(int);sort(a,a+len);//由小到大排列sort(a,a+len,greater<int>());//由大到小排列}vo......
  • go语言tcp编程学习
    TCP编程1、网络编程分类包括TCPsocket编程(底层基于tcp/ip协议)和b/s结构的http编程(使用的是http协议,但是底层是tcpsocket实现的)资料:尚硅谷的TCP资料(3卷),可以咸鱼找下资料看下2TCPsocket编程windows查看端口密码:netstat-anb;netstat-an服务器端的处理流程监听端口;接受......
  • Go 中的格式化字符串`fmt.Sprintf()` 和 `fmt.Printf()`
    在Go中,可以使用fmt.Sprintf()和fmt.Printf()函数来格式化字符串,这两个函数类似于C语言中的scanf和printf函数。fmt.Sprintf()fmt.Sprintf()函数返回一个格式化后的字符串,而不是将其打印到标准输出流中。下面是一个例子:packagemainimport"fmt"funcmain(){......
  • go 接口循环方法
    typeCallinterface{String()string}typeCnstruct{}typeEnstruct{}funcNewcn()Call{return&Cn{}}func(c*Cn)String()string{b,_:=json.Marshal(c)fmt.Println(b)returnstring(b)}funcNewen()Call{return&En{}}func(e*E......
  • Springboot整合mongodb
    入门案例创建工程,导入依赖导入依赖点击查看代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.3.9.RELEASE</version>......
  • Go语言学习总结
    1.跳出/执行下一次循环。{标签名}:fortrue{...fortrue{...break/continue{标签名}//默认不加标签,则跳出最近一层循环。加了标签可以跳出标签定义处所在循环}}2.map的使用注意项。因为map是指针,作为参数传递时,在函数内部对map作的修改......