问题标签 [go-context]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - 使用上下文在连续的函数调用之间共享一个公共超时
我想在 Go 程序中进行一些连续的函数调用,例如
(显然省略了错误检查)
我希望整个调用序列在一定时间内完成,否则应该中止该过程(并且程序退出错误)
假设我有超时(作为持续时间)以某种方式传递到我的程序中,我想一种方法是
a)创建一个带有截止日期的上下文,将超时添加到当前时间
b)让最终函数通过通道传达其结果(我认为这称为通道生成器模式?)
和
c ) 然后在 select 语句上阻塞主 goroutine,如下所示
这是我现在能想到的最好的方法,但我在徘徊是否有更好或更惯用的方式(比如为每个函数生成新的上下文副本 - 当然应该接受context.Context
作为输入参数)以某种方式跟踪剩余时间?)
go - 使用带有取消的上下文,Go 例程不会终止
我是 Go 和 Go 并发的新手。一旦找到具有给定 ID 的成员,我正在尝试使用 Go 上下文来取消一组 Go 例程。
一个组存储一个客户列表,每个客户都有一个成员列表。我想并行搜索所有客户及其所有成员,以找到具有给定 ID 的成员。一旦找到此成员,我想取消所有其他 Go 例程并返回发现的成员。
我尝试了以下实现,使用 context.WithCancel 和 WaitGroup。
然而,这不起作用,并且无限期地挂起,永远不会越过waitGroup.Wait(),但我不确定为什么。
http - Go-Context:流处理http post请求正文,同时在处理过程中取消请求有时会出现“对等方重置连接”错误
我们有一个网络服务器,它基本上接受 HTTP 发布请求,流式处理请求正文,并将请求正文上传到外部存储。
我们以一次 4KB 的速度从请求正文中读取并处理它们,并将它们上传到外部存储(同时)。在处理过程中,如果我们读取的字节失败了我们的业务逻辑,我们使用ctx
生成的context.WithCancel(Request().Context())
来取消请求。这也将取消上传。如果上下文已被取消,我们也会在这种情况下返回 400 响应。
问题是,当我们测试我们的 Web 服务器时,我们的客户端有时会收到 104 错误:如果对等方发出的请求会使我们的业务逻辑失败,则连接重置。我们不确定此响应来自何处,因为我们返回的是 400 响应。
我在网上做了一些研究,发现这可能是服务器没有完全读取和使用请求正文的情况。当未使用的数据量达到 TCP 缓冲区大小时,TCP 将关闭连接,这就是我们收到此 109 错误的原因。有谁知道是否是这种情况?
go - echo.Context 的 Set() 方法是否将值保存到底层 context.Context?
我正在使用Echo 框架,并希望在设置一些自定义值后传递 Go 内置的context.Context
底层 echo.Context 。
为了实现它,我想我可以先应用Set(key string, val interface{})
方法,echo.Context
然后提取底层的context.Context
.
问题是可以这样做吗?换句话说,doesecho.Context.Set(...)
直接设置值context.Context
就像WithValue
does一样?或者我应该采取额外的步骤来复制我的自定义条目。
PS我不想传递echo.Context
到我的应用程序的更深层,这就是为什么我不想直接使用它但得到引用context.Context
go - 如何使用 context.WithValue() 存储 context.CancelFunc 类型的值?
要在 中存储string
类型数据ctx
,需要对 key 和 value 使用类型定义,如下所示:
如何context.CancelFunc
使用context.WithValue()
api 存储类型的值?
go - Go 上下文取消函数的最佳实践
我一直在阅读一些关于使用 golang 的 context 包的文章。我最近在博客中看到了以下文章:http: //p.agnihotry.com/post/understanding_the_context_package_in_golang/
该文章对 go 中的上下文取消功能进行了以下说明:
“如果你愿意,你可以传递取消函数,但是,强烈不建议这样做。这可能导致取消的调用者没有意识到取消上下文可能会对下游产生什么影响。可能还有其他派生的上下文这可能会导致程序以意想不到的方式运行。简而言之,永远不要绕过取消函数。
但是,如果我希望激活父 context.Done() 通道,将取消函数作为参数传递似乎是唯一的选择(请参见下面的代码片段)。例如,下面代码片段中的代码 Done 通道仅在执行 function2 时才被激活。
那么,传递这个取消函数真的是个问题吗?是否有与使用 context 包及其取消功能相关的最佳实践?
go - API 设计的 Fire and Forget 端点
我目前正在维护一些基于标准库和 gorilla mux 并在 kubernetes (GKE) 中运行的 HTTP API。
我们采用http.TimeoutHandler
“标准”方式来进行一致的超时错误管理。典型的端点实现将使用以下“链”:
这样我们就可以监控每个端点的一些关键指标。
我们的一个 API 通常用于“即发即弃”模式,这意味着客户端将推送一些数据而不关心 API 响应。我们面临的问题是
这意味着当客户端断开连接时我们不会处理完成的请求,这不是我们想要的,因此我正在寻找解决方案。
我能找到的唯一与我的问题有关的讨论是https://github.com/golang/go/issues/18527;然而
Handler
解决方法是您的应用程序可以忽略Request.Context()
将意味着监控中间件不会报告“正确”状态,因为Handler
它将在其 goroutine 中执行请求处理,但TimeoutHandler
将强制执行状态并且可观察性将被破坏。
目前,我不考虑删除我们的中间件,因为它们有助于我们的 API 在行为和可观察性方面保持一致性。到目前为止,我的结论是,TimeoutHandler
当处理程序不应依赖于等待响应的客户端时,我需要“分叉”并使用自定义上下文。
我目前想法的要点是:
中间件BaseContext
回调将返回context.Background()
对“即发即弃”端点的请求。
我不喜欢的一件事是,这样做我会丢失任何编写的上下文键,因此这个新的中间件会有很强的使用限制。总的来说,我觉得这比它应该的要复杂。
我完全错过了一些明显的东西吗?欢迎任何关于 API 检测(也许我们的中间件是反模式)/fire and forget 实现的反馈!
编辑:由于大多数评论是客户端不等待响应的请求具有未指定的行为,因此我检查了有关发生这种情况的典型客户端的更多信息。
从我们的日志来看,这发生在看似移动设备的用户代理上。我可以想象连接可能会更加不稳定,问题可能不会消失。因此,我不会断定我不应该找到解决方案,因为这目前正在创建误报警报。
go - 是否可以使用上下文和缓冲通道作为队列?而且我不确定这是否是线程安全的
我需要创建一个将数据传递给多个消费者的队列。我可以使用缓冲通道和上下文吗?而且我不确定这是否是线程安全的
这是我正在谈论的示例代码:
它是线程安全的吗?我的逻辑进展顺利吗?
如果有任何错误,我希望收到反馈
如果有更好的做法,请告诉我。
opentracing - 如何在 Go 中跨 Kafka 消费者传播跨度上下文?
我正在尝试在 Kafka 消费者之间传播跨度,以使用OpenTracing 的 FollowsFrom 引用查看消息的处理历史。
我有一个生产者库,它目前有一个Produce(msg)
函数,我正在考虑将其签名迁移为Produce(ctx, msg)
,然后在生成它之前自动将 ctx 中的 span 上下文注入到 Kafka 消息头中。但是,我担心这不是正确的使用方式,context.Context
因为我只是在传播嵌入在 ctx 中的 SpanContext,而不是任何现有的截止日期。
这是正确的使用方式context.Context
还是我的 API 应该不同?