go语言协程(代码片段)

styshoo styshoo     2022-12-07     376

关键词:

概述

Go语言中,协程可以简单理解为轻量级的线程。
协程开销比线程低,M个协程运行在N个线程上,也就是通常所说的M:N模型。协程完全由Golang运行时管理,而不是由操作系统管理。线程是抢占式的多任务,而协程是非抢占式的任务。通过以上这些方法,从而实现了协程的轻量化。

使用

Golang创建协程非常简单,只需要go FuncName()即可。

package main

import (
	"fmt"
)

func print(name string) 
	for i := 0; i < 5; i++ 
		fmt.Printf("%s: %d\\n", name, i)
	


func main() 
	go print("go")
	print("main")

输出:

main: 0
main: 1
main: 2
main: 3
main: 4

可以看到,只在主协程有输出,这是因为主协程不会等待其他协程执行完成。这里,我们可以加上一个等待时间,就可以看到其他协程的执行。

修改后的代码:

import (
	"fmt"
	"time"
)

func print(name string) 
	for i := 0; i < 5; i++ 
		time.Sleep(5 * time.Millisecond)
		fmt.Printf("%s: %d\\n", name, i)
	


func main() 
	go print("go")
	print("main")

输出:

main: 0
go: 0
go: 1
main: 1
main: 2
go: 2
go: 3
main: 3
main: 4
go: 4

Go语言支持匿名函数,那当然也就支持匿名协程了。
这里也加上了sleep函数,否则主线程就不会等待协程就直接结束了。

package main

import (
	"fmt"
	"time"
)

func main() 
	go func(name string) 
		for i := 0; i < 5; i++ 
			fmt.Printf("%s: %d\\n", name, i)
		
	("go")
	time.Sleep(10 * time.Millisecond)


输出:

go: 0
go: 1
go: 2
go: 3
go: 4

go语言并发编程(代码片段)

一、goroutine与传统的系统级线程和进程相比,协程的大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常多也不能超过1万个。这也是协程也叫轻量级线程的原因。golang原生支持并发编... 查看详情

golang✔️走进go语言✔️第十六课协程&通道(代码片段)

【Golang】✔️走进Go语言✔️第十六课协程&通道概述协程并发vs并行进程vs线程vs协程协程并发通道创建通道通道同步概述Golang是一个跨平台的新生编程语言.今天小白就带大家一起携手走进Golang的世界.(第16课)协程协程(Coroutine)... 查看详情

golang✔️走进go语言✔️第十六课协程&通道(代码片段)

【Golang】✔️走进Go语言✔️第十六课协程&通道概述协程并发vs并行进程vs线程vs协程协程并发通道创建通道通道同步概述Golang是一个跨平台的新生编程语言.今天小白就带大家一起携手走进Golang的世界.(第16课)协程协程(Coroutine)... 查看详情

一文看懂go语言协程的设计与原理(代码片段)

...新加坡】,欢迎关注。个人博客网站:一文看懂Go语言协程的设计与原理背景Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine࿱... 查看详情

一文看懂go语言协程的设计与原理(代码片段)

...新加坡】,欢迎关注。个人博客网站:一文看懂Go语言协程的设计与原理背景Go语言最大的特色就是从语言层面支持并发(Goroutine),Goroutine是Go中最基本的执行单元。事实上每一个Go程序至少有一个Goroutine࿱... 查看详情

go协程与协程池(代码片段)

1.Golang协程golang和其它语言最大区别莫过于goroutine,也就是go的协程,example如下:packagemainimport"fmt"import"time"funcgo_worker(namestring) fori:=0;i<10;i++ fmt.Println(& 查看详情

go语言|协程池的应用(可能是全网最适合小白的教程)(代码片段)

文章目录前言需求分析协程池和多线程相关概念go协程池(goroutine)go协程池ants库实现sync.WaitGroupsync.Mutexchanpoolchan<-前言为什么说这是全网最适合小白的呢?因为我就是一个第一次写多线程,使用协程池的小白&#x... 查看详情

go协程(代码片段)

什么是Go协程?Go协程是与其他函数或方法一起并发运行的函数或方法。Go协程可以看作是轻量级线程。与线程相比,创建一个Go协程的成本很小。因此在Go应用中,常常会看到有数以千计的Go协程并发地运行。packagemainimport("fmt""tim... 查看详情

go语言学习之路(代码片段)

Go语言学习之路(二)面对对象编程思想抽象封装继承接口文件命令行参数Json序列化反序列化(unmarshal)单元测试RedisRedis简介Redis基本使用Go连接redisRedis连接池Go面试题goroutine和channel(275-283)协程goroutine... 查看详情

go语言学习之路(代码片段)

Go语言学习之路(二)面对对象编程思想抽象封装继承接口文件命令行参数Json序列化反序列化(unmarshal)单元测试RedisRedis简介Redis基本使用Go连接redisRedis连接池Go面试题goroutine和channel(275-283)协程goroutine... 查看详情

go协程与协程池(代码片段)

1.Golang协程golang和其它语言最大区别莫过于goroutine,也就是go的协程,example如下:packagemainimport"fmt"import"time"funcgo_worker(namestring) fori:=0;i<10;i++ fmt.Println("thisisgoworker:",name) funcmain() gogo_worker(&#... 查看详情

go笔记(十五):并发编程(代码片段)

一、协程的创建  Go语言支持并发,只需要通过go关键字来开启goroutine(协程)即可。  goroutine(协程)是轻量级线程,goroutine(协程)的调度是由Golang运行时进行管理的。goroutine语法格式(创建协程):go函数名(参数列表)示例代码如... 查看详情

go并发编程基础-channel(代码片段)

协程(Goroutine)Go语言中没有线程的概念,只有协程,也称为goroutine。相比线程来说,协程更加轻量,一个程序可以随意启动成千上万个goroutine。goroutine被Goruntime所调度,这一点和线程不一样。也就是说,Go语言的并发是由Go自己... 查看详情

golang教程:goroutine协程(代码片段)

...并行的区别。在这篇教程中我们将讨论在Go中如何通过Go协程实现并发。什么是协程Go协程(Goroutine)是与其他函数或方法同时运行的函数或方法。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此... 查看详情

go协程(代码片段)

Go协程是什么?Go协程是与其他函数或方法一起并发运行的函数或方法。Go协程可以看作是轻量级线程。与线程相比,创建一个Go协程的成本很小。因此在Go应用中,常常会看到有数以千计的Go协程并发地运行。Go协程相比于线程的... 查看详情

java19虚拟线程vsgo协程的吞吐量(代码片段)

...9带来了 Java新特性——虚拟线程。Java新特性之前,Go语言的协程在并发编程领域得到友好的口碑。随着国内Go语言的快速发展与推广,协程好像成为了一个世界上最好语言的必备特性之一。Java19虚拟线程就是来弥补这个... 查看详情

七天入门go语言通道&goroutine|第四天并发编程(代码片段)

1.前言在go社区有这样一句话不要通过共享内存来通信,而是通过通信来共享内存。go官方是建议使用管道通信的方式来进行并发。通道是用于协程间交流的通信载体。严格地来说,通道就是数据传输的管道,数据通过... 查看详情

go语言sync.cond(代码片段)

sync.Cond是一个事件通知,类似于java中的conditional或者wait/notify机制。它有一个重要的作用是,协程之间通过锁进行协调的时候,其中一个协程等待的时候,可以释放锁和资源,并且能够及时完成准备工作。比如经典的生产者消费... 查看详情