栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Webhook进程在另一个goroutine上运行

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Webhook进程在另一个goroutine上运行

服务每个http请求都在其自己的goroutine中运行。您可以从处理程序中启动新的goroutine,它们将并发运行,与执行处理程序的goroutine独立。

要注意的一些事情:

  • 新的goroutine与处理程序goroutine独立运行。这意味着它可能在处理程序goroutine之前或之后完成,如果没有显式同步,则不能(不应)对此进行任何假设。

  • 处理程序的

    http.ResponseWriter
    http.Request
    参数只有在处理程序返回之前才有效且可以安全使用!这些值(或其中的“部分”)可以重复使用-这是一个实现细节,您也不应假设任何事情。处理程序返回后,您不应触摸(甚至不读取)这些值。

  • 处理程序返回后,将提交响应(或者可以随时提交响应)。这意味着您的新goroutine不应尝试使用

    http.ResponseWriter
    after之后发送回任何数据。即使您没有触摸
    http.ResponseWriter
    处理程序中的,这也是正确的,即使没有从处理程序中惊慌也被视为对请求的成功处理,并因此将HTTP 200状态发送回

您可以将

http.Request
http.ResponseWriter
值传递给其他函数和新的goroutine,但必须小心:如果要从多个goroutine中读取/修改这些值,则应使用显式同步(例如,锁,通道)。从多个goroutine发送回数据)。

请注意,看来,如果您的处理程序goroutine和新的goroutine都只读取/检查了

http.Request
,则可能仍然有问题。是的,多个goroutine可以读取同一变量而无需同步(如果没有人修改它)。但是,调用的某些方法
http.Request
也会修改
http.Request
,并且如果没有同步,则无法保证其他goroutine从此更改中会看到什么。例如,
Request.FormValue()
返回与给定键关联的表单值。但是,此方法调用,
ParseMultiPartForm()
并且
ParseForm()
在必要时会对其进行修改
http.Request
(例如,它们设置
Request.PostForm
Request.Form
字段)。

所以,除非你同步够程,你不应该传递

Request
ResponseWriter
新够程,但是从需要采集数据
Request
的处理够程,并通过只如
struct
持有所需要的数据。

您的第二个示例:

foo := int64(0)bar := func() {   // do slow things with foo}go bar()

很好
这是一个闭包,它引用的局部变量只要可以访问就可以保留。

请注意,您也可以将局部变量的值作为参数传递给匿名函数调用,如下所示:

foo := int64(0)bar := func(foo int64) {   // do slow things with param foo (not the local foo var)}go bar(foo)

在此示例中,匿名函数将查看并使用其参数,

foo
而不是局部变量
foo
。这可能是您想要的,也可能不是您想要的(取决于处理程序是否还使用
foo
和以及对任何goroutine所做的更改是否需要对他人可见-
但这仍然需要同步,这将由通道解决方案取代)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484344.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号