工作用Go: 异步任务怎么写1 | Go协程与异步

简介: 工作用Go: 异步任务怎么写1 | Go协程与异步

go01.jpeg

本文为 工作用Go: 异步任务怎么写 系列的第1


在响应应用请求的过程中, 有时候会遇到比较耗时的任务, 比如给用户发送邮件, 耗时任务时间不可能控, 很可能超过 1s, 为了给用户比较好的体验, 一般会控制请求响应时间(RT, response time)在 300ms 内(不考虑网络波动), 甚至在 200ms 内. 面对这样的工作场景, 就需要使用异步任务进行处理.


从一段简单的代码开始:


funcTestTask(t*testing.T) {
task()
log.Print("req done")
}
functask() {
// 模拟耗时任务time.Sleep(time.Second)
log.Print("task done")
}


  • 代码在 Goland 中编写, 同时也推荐使用 Goland 进行 Go 开发
  • 这里使用单测(test)演示代码:
  • 输入 test 就可以快速生成代码(Goland 中称之为 live templates, 其实就是预设好的代码片段)
  • 在单测点击可以执行: 1. 点击左侧(gutter icon)的运行图标; 2. 函数上右键菜单键; 3. 快捷键 ctl-shift-R


上面使用 task() 模拟耗时 1s 的任务, 整个test代表一次请求, 执行如下:


===RUNTestTask2022/11/1720:11:15taskdone2022/11/1720:11:15reqdone---PASS: TestTask (1.00s)
PASS


Go基础知识: 天生并发, 使用 go 关键字就可以开新协程, 将代码放到新协程中执行


funcTestTask(t*testing.T) {
gotask()
log.Print("req done")
}
functask() {
// 模拟耗时任务time.Sleep(time.Second)
log.Print("task done")
}


  • 只需要在 task() 前添加 go 关键字, 就可以新开一个协程, 将 task() 在新协程中执行


不过在这里, 并没有得到预期的结果:


===RUNTestTask2022/11/1720:16:08reqdone---PASS: TestTask (0.00s)
PASS


  • 输出显示: task() 中的日志没有输出, 看起来像没有执行


Go基础知识: Go的代码都在协程中执行, 入口 main() 函数是主协程, 之后使用 go 关键词开的协程都是子协程, 主协程退出后, 程序会终止(exit)


也就是说上面的 TestTask()(主协程) 和 go task()(子协程)都执行了, 但是主协程执行完, 程序退出了, 子协程没执行完(或者没调度到), 就被强制退出了

目录
相关文章
|
6天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
6天前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
28 6
|
6天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
6天前
|
安全 Go 调度
|
6天前
|
存储 Python
python使用gevent库来创建协程,并通过协程实现并发执行不同的任务
```markdown 这段Python代码利用`gevent`库实现并发执行协程。定义了两个打印函数`f1`和`f2`,分别输出"csdn"和"yyds"。代码首先创建列表`t_l`,并启动5个`f1`协程,将其加入列表并等待所有协程完成。随后,同样方式启动5个`f2`协程,存入`t1_l`列表并等待执行完毕。整体展示了`gevent`的协程并发操作。 ```
14 1
|
6天前
|
Linux 程序员 C++
【C++ 常见的异步机制】探索现代异步编程:从 ASIO 到协程的底层机制解析
【C++ 常见的异步机制】探索现代异步编程:从 ASIO 到协程的底层机制解析
154 2
|
6天前
|
程序员 Go 数据处理
|
6天前
|
数据可视化 Go
|
6天前
|
程序员 调度 云计算
Python并发编程的未来趋势:协程、异步IO与多进程的融合
Python并发编程的未来趋势:协程、异步IO与多进程的融合
|
6天前
|
存储 安全 Java
深入浅出Go并发之协程—goroutine
深入浅出Go并发之协程—goroutine
37 0