首页 > 编程知识 正文

golang goroutine(golang和nodejs哪个好)

时间:2023-05-05 16:00:34 阅读:104564 作者:4807

1 场景

我们知道,在Go服务器中,每个传入的请求都将由其goroutine处理。

例如,在下面的代码中,Handler将创建一个goroutine来为每个请求提供服务,R的地址对于三个连续的请求将是不同的。

对应于每个请求的处理程序通常会启动额外的数据查询或PRC调用等。

当请求返回时,这些额外的goroutine需要及时回收。此外,对应于请求的一组请求字段中的数据可能是请求的调用链中的每个goroutine所需要的。

例如,在下面的代码中,当请求进入时,Handler将创建一个监视goroutine,它将每1秒打印一次“req正在处理”。

假设请求需要3秒钟,即请求在3秒钟后返回,我们预计在打印3次“请求正在处理”后,监控goroutine将停止。但是发现监控goroutine打印3次后,并不会结束,而是继续打印。

问题是监控goroutine的生命周期在创建后没有得到控制。让我们用context来控制它,即监控程序在打印前需要检查r.Context()是否已经结束,如果结束,就退出循环,即结束生命周期。

基于以上需求,上下文包应用应运而生。

上下文包可以提供从API请求边界到每个goroutine的数据传输、取消信号和请求域截止时间的能力。

2 Context类型

Done方法返回一个通道,当上下文被取消或到达最后期限时,该通道将被关闭。Err方法返回取消上下文的原因。

Context没有自己的cancel方法,Done通道只用于接收信号:接收cancel信号的函数不应该是同时发送Cancel信号的函数。父goro tine推广者goro tine做一些子操作,子goro tine不应该用来取消父goro tine。

上下文是安全的,可以由多个goroutine同时使用。一个上下文可以传递给多个类,所有这些类都可以被取消。

如果有deadline,Deadline方法可以返回上下文的取消时间。

允许ValueContext携带请求域中的数据,数据访问必须保证多个goroutine同时访问的安全性。

3 衍生Context

上下文包提供了从现有上下文派生新上下文的能力。因此,可以形成上下文树。当父上下文被取消时,从其派生的所有子上下文也将被取消。

背景是所有上下文树的根,永远不会被取消。

使用WithCancel和WithTimeout创建一个派生上下文,使用WithCancel取消一组从它派生的规则,使用WithTimeout设置截止日期。

WithValue为上下文提供了请求域数据的能力。

00-1010 1)首先,看看WitchCancel的用法。

在下面的代码中,main函数使用WithCancel创建一个基于背景的ctx。

然后启动一个监视器,监视器每1s打印一个“监视器工作”字,3s后主功能执行取消,监视器检测到取消信号后退出。

2)再看一个使用WithTimeout的例子。在下面的代码中,使用WithTimeout创建一个基于背景的ctx,它将在3s后被取消。

请注意,虽然截止日期将自动取消,但取消代码仍然建议添加。

这取决于哪个信号发送得更早,是被时限取消还是被取消码取消。

WithDeadline的使用类似于WithTimeout。

如果不知道Context的具体用法,可以用TODO放置一个地方,也方便工具检查正确性。

3)最后,看看WithValue的用法。

下面的代码创建一个ctx,其值基于Background,然后可以根据键取值。

注意:为了避免多个包同时使用上下文引起的冲突,建议自定义键类型,而不是使用字符串或其他内置类型。

最后,列出上下文使用规则:

a)不要把Context作为struct的一个字段,而是把它作为每个使用它的函数的一个参数,这个参数需要定义为一个函数或者方法的第一个参数,一般叫做ctx;

b)不要将零传递给上下文参数。如果您不想使用该上下文,请传递上下文。待办事项;

c)使用上下文传递值只能作为请求域的数据,请不要滥用其他类型的数据;

d)同一个上下文可以使用它传递给多个goro utine,多个goro utine可以同时安全地访问该上下文。

参考数据

[1]https://blog.golang.org/context

[2]https://golang.org/pkg/context/

原文:https://leileiluoluo.com/posts/golang-context.html

作者:雷蕾洛洛博客,原创授权发布

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。