我有一个服务于异步作业的HTTP服务器应用程序。
-> Request
--> Do async job with goroutine
<- Response
-------start goroutine------
-> Job1
-> Job1A
-> Job1B
-> Job2
-> Job3
用户可以请求长时间运行的异步作业,应用程序在make goroutine之后立即响应请求。
我将请求ID、经过身份验证的令牌和用户信息放在请求的context.Context
中。我想把它放在goroutines下面。但是,在请求context
中使用相同的context
将导致在响应后意外取消,这不是我想要的行为。
我如何生成新的context
与所有值,独立于父请求context
?或者,有没有其他方法可以保证context
在响应后不会死?
还有一个问题Job1
~ Job3
应该串行化,即Job2
应该等待Job1
,Job3
应该等待Job2
。而且,Job1A
和Job1B
可以同时运行。如果我想传播给定context
的取消,我如何使取消路径(?我应该检查所有函数的select语句吗?
我理解了context
传播消除和提前退出的概念,而不做无意义的任务。但是,我还没有掌握如何在代码中处理。如果有人能帮我理解我会很高兴的。
1条答案
按热度按时间kxeu7u2r1#
没有办法发现上下文中的值。它们不存储为Map,而是存储为上下文层,并且每个级别可以提供如何存储值的不同实现。
但是,如果您知道需要传播哪些值,则可以查询它们并使用这些值创建新上下文。
也就是说,你可以实现一个新的上下文类型,在另一个上下文中使用这些值:
这将为值使用现有上下文,为其他所有内容使用新上下文。
然后,启动一个新的goroutine,使用新的上下文继续处理请求。
如果你想创建多个并发作业,你可以在goroutine中完成:
这样,当上下文被取消时,两个作业都将收到取消通知。如果要分别控制job1和job2的取消:
对于连续作业(即job3在job1)之后完成,只需将它们合并,使它们看起来像一个作业。
要检查上下文是否被取消,您可以在上下文的
Done
通道上执行select
,或者简单地检查: