当在中间件或 handler 中启动新的 Goroutine 时,不能使用原始的上下文,必须使用只读副本。
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
func main() {
r := gin.Default()
r.GET("/test1", func(c *gin.Context) {
// 拷贝一份副本在Goroutine中使用
tmp := c.Copy()
go func() {
time.Sleep(5 * time.Second)
// 这里使用的是值拷贝的tmp
log.Println("test1已完成,路径是:" + tmp.Request.URL.Path)
}()
})
r.GET("/test2", func(c *gin.Context) {
time.Sleep(5 * time.Second)
// 因为没有使用 goroutine,不需要拷贝上下文
log.Println("test2已完成,路径是:" + c.Request.URL.Path)
})
r.Run()
}
以上代码执行结果如下
tornado.netutil.bind_sockets(port:int,address:Optional[str]=None,family:socket.AddressFamily=AddressFamily.AF_UNSPEC:0,b...
用于处理Future对象的实用程序。Tornado之前提供了自己的Future类,但现在使用asyncio.Future。此模块包含用于与Tornado...
自定义后台表单通过 admin.site.register(Question) 注册 Question 模型,Django 能够构建一个默认的表单用于展示。通常...
Java Swing教程 -Java Swing JFormattedTextFieldJFormattedTextField是一个具有格式化功能的JTextField。我们可以指定编辑和显...
设置项目的选定状态。JCheckBoxMenuItem类表示从菜单栏部署的下拉菜单组件。类声明以下是javax.swing.JCheckBoxMenuItem类的声明...
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!『仓廪实而知礼节,衣食足而知荣辱 –管仲 』...
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!『 公司的核心竞争力在于创新 – 《启示录》 ...
MyBatis-Plus 条件构造器-AbstractWrappernotExists(String notExistsSql)notExists(boolean condition, String notExistsSql)拼...
注意:适用版本:mybatis-plus-generator 3.5.1 以下版本AutoGenerator是MyBatis-Plus的代码生成器,通过AutoGenerator可以快速...