首页 > 其他分享 >go: 协程生命周期控制

go: 协程生命周期控制

时间:2024-03-01 09:00:10浏览次数:24  
标签:生命周期 协程 取消 王义杰 context time go

go: 协程生命周期控制

原创 王义杰 运维开发王义杰 2024-02-28 22:27 广东 听全文

在go开发中,如果我们希望在一定条件下,比如执行了某些任务后,主动结束其它相关的协程,可以通过使用context包来实现。context包允许我们发送取消信号给一个或多个协程,这样我们就可以控制协程的生命周期,包括它们的启动和结束。下面是一个使用context包来结束协程的示例:

 

go

package main

import (
"context"
"fmt"
"time"
)

func main() {
// 创建一个context对象和一个取消函数
ctx, cancel := context.WithCancel(context.Background())

// 在新的协程中运行一个任务
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("协程被取消")
return
default:
// 模拟协程正在执行任务
fmt.Println("协程正在执行任务...")
time.Sleep(1 * time.Second)
}
}
}(ctx)

// 模拟主程序执行了一些任务
time.Sleep(3 * time.Second) // 假设主程序执行了3秒的任务

// 现在我们想要取消协程
fmt.Println("准备取消协程")
cancel() // 调用取消函数来发送取消信号

// 给协程一点时间来响应取消信号
time.Sleep(1 * time.Second)

fmt.Println("主程序结束")
}

在这个示例中,我们首先通过context.WithCancel(context.Background())创建了一个context对象和一个cancel函数。这个cancel函数可以被调用来发送取消信号。

然后,我们在一个新的协程中启动了一个无限循环的任务,这个任务会定期检查ctx.Done()通道。这个通道在cancel函数被调用时会接收到一个值,表示接收到了取消信号。一旦接收到取消信号,协程就会退出循环并结束执行。

在主函数中,我们模拟了一些任务的执行,然后调用cancel函数来发送取消信号。协程通过检查ctx.Done()来响应这个信号并终止执行。

使用context包来控制协程的取消是Go语言并发编程中的一种常见模式,它为管理和取消协程提供了一种优雅的方式。希望这个示例能够帮助读者理解如何在Go程序中主动结束运行中的协程。

图片

 

王义杰

赞赏二维码喜欢作者

go258 软件开发560 go · 目录 上一篇依赖注入模式:软件架构的灵活之选下一篇go: 匿名函数实现递归 阅读 11 运维开发王义杰 ​ 喜欢此内容的人还喜欢   网络:常用的网络协议及其协议号     运维开发王义杰 不看的原因   探索软件架构的艺术:C4模型与4+1视图模型的比较与应用     运维开发王义杰 不看的原因   软件设计的全方位解决方案:整合领域驱动设计、UML和4+1架构视图模型     运维开发王义杰 不看的原因   写留言              

人划线

 

标签:生命周期,协程,取消,王义杰,context,time,go
From: https://www.cnblogs.com/cheyunhua/p/18046080

相关文章

  • lua协程 - 把回调模式的代码流程改成顺序执行流程
    像ugui的点击按钮,然后触发相关逻辑,都是回调模式的写法,比如下面代码的ShowAlert调用publicclassTest7:MonoBehaviour{publicGameObjectm_Alert;publicTextm_TxtMsg;publicButtonm_BtnYes;publicButtonm_BtnNo;privateLuaEnvm_LuaEnv;......
  • Go 100 mistakes - #86: Sleeping in unit tests
      ......
  • Vue Router系列之(十一)两个新的生命周期钩子
    两个新的生命周期钩子​ 缓存路由组件和定时器一起使用时,如果进行了路由跳转,本应触发在beforeDestroy钩子中清除定时器方法,但因为缓存了路由组件,就导致原来的路由组件的beforeDestroy钩子不会被触发,定时器也就不会清除作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态......
  • Vue 2x 系列之(十八)生命周期
    生命周期[函数]......
  • Django的视图响应机制-一次性响应OR流式响应
    一次性响应:HttpResponse类及其子类、JsonResponse类流式响应:SteamingHttpResponse类、FileResponse类文件下载为例#HttpResponse方式,文件内容一次性响应,仅适合小文件deffile_download(request):withopen('data.txt')asf:c=f.read()returnHttpRespons......
  • Vue2.x生命周期函数
    介绍Vue.js2.x中的生命周期函数是一系列钩子函数,它们允许你在Vue实例的不同阶段执行代码。这些生命周期钩子函数允许你在特定的阶段添加自定义逻辑,以便在应用程序生命周期的不同点执行操作。创建阶段1)beforeCreate(创建前):在Vue实例初始化之后,数据观测(dataobs......
  • Go 100 mistakes - #82: Not categorizing tests
         ......
  • Django项目中使用JWT身份验证
    一、什么是JWTJWT,全称是JSONWebToken,是一个开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,用于在多方之间安全地传输JSON格式的信息。这些信息可以被验证和信任,因为它们是数字签名的。JWT由三部分组成:头部(Header)、负载(Payload)、签名(Signature),每部分之间以.分隔。JWT最常见......
  • Go 100 mistakes - #81: Using the default HTTP client and server
        ......
  • Go语言精进之路读书笔记第40条——理解包内测试与包外测试的差别
    测试代码存放在包含TestXxx函数的以*_test.go文件名结尾的文件中40.1官方文档的“自相矛盾”包内测试:测试代码放在与被测包同名的包中包外测试:测试代码放在名为被测包包名+"_test"的包中40.2包内测试与包外测试包内测试:优:白盒测试,高覆盖率缺:测试代码自身需要经常性的维......