问题标签 [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.

0 投票
1 回答
1906 浏览

http - 为什么建议使用 ctx 作为第一个参数?

正如文件所说

不要将上下文存储在结构类型中;相反,将 Context 显式传递给需要它的每个函数。Context 应该是第一个参数,通常命名为 ctx

但我发现,在典型的 http 请求句柄函数中,一个http.Request对象的.Context()方法可以检索与 http 请求关联的上下文。

那么为什么建议在这些函数中使用上下文作为第一个参数。在这种情况下这样做合理吗?


我知道这不是限制规则。但我不知道为什么HandlerFuncfunc(ResponseWriter, *Request)而不是func(context.Context, ResponseWriter, *Request)

显然,HandlerFunc打破建议。

0 投票
1 回答
771 浏览

go - 在 Go HTTP 处理程序中使用未导出的结构键获取上下文值时为 nil

任何帮助在这里表示赞赏!我确定我错过了一些非常基本的东西。

我遇到的问题是我试图在演示 Web 应用程序中获取上下文之外的值,并且收到错误消息:

2021/04/11 11:35:54 http: panic serving [::1]:60769: interface conversion: interface {} is nil, not []string

在我的主要功能中,我使用以下内容设置上下文:

然后在我的处理程序中,我有以下内容:

我知道我遗漏了一些简单的东西,因为如果我尝试上面的代码并将我的getField()函数放在package main一切正常的范围内。

作为参考,这是一个学习练习,我正在尝试自学 Go 路由。我确实知道有可用的路由包 - 但我的目标是学习。我正在尽力遵循Go 中 HTTP 路由的不同方法。我还通读了上下文值的陷阱以及如何在 Go 中避免或减轻它们。后者似乎直接解决了我遇到的问题,但我似乎无法根据现有的情况弄清楚如何解决它。

0 投票
2 回答
399 浏览

go - 上下文因超时而取消但计算未中止?

试图了解 go 上下文取消将如何中止后续代码的执行

实验细节:

  1. main func 有一个超时的上下文2sec
  2. main funcsum在单独的 go-routine 中调用另一个 func - 它1sec为 test-run-1 和4sec为 test-run-2休眠
  3. 让 main sleep3sec让 spun go-routine 完成执行

testcase-1 的响应:睡眠总和功能 1 秒:

testcase-2 的响应:睡眠总和功能 4 秒:

在 testcase-2 中,当 sum func 休眠 4 秒时,上下文已经在 2 秒后被超时取消,为什么它仍然在 diff go-routine 中执行 sum func 并打印print from sum fn: 1

来自文档:取消此上下文会释放与其关联的资源。

我的假设是所有计算将在 2 秒后立即中止,包括旋转的 go-routine

让我知道如何正确执行此操作,提前谢谢

0 投票
1 回答
509 浏览

go - golang ctx取消没有按预期工作

输出:-

正如在上面的输出中注意到的那样,我看到调用上下文的取消函数后 numof goroutines 仍然相同。您甚至可以在取消函数调用后看到 goroutine 的打印。我的期望是调用取消函数将终止传递此 ctx 的 go 例程。请帮助我了解上下文取消功能的行为。

0 投票
1 回答
820 浏览

go - 如何将上下文值从 Gin 中间件传播到 gqlgen 解析器?

我正在尝试在令牌身份验证中间件中提取 user_id 并将其传递给gqlgen的 graphql 解析器函数(以填充 GraphQL 模式的 created_by 和 updated_by 列)。身份验证部分可以正常工作。

Gin 中间件:

graphql 解析器:

在这里,我尝试使用全局变量 UID 来执行此操作,但 UID 的值没有在中间件中更新,因此,我在CreatedByUpdatedBy列中获得了“虚拟”值。我知道不鼓励使用全局变量,我对其他想法持开放态度。谢谢

0 投票
1 回答
877 浏览

go - 使用上下文跳出循环

考虑一下(https://play.golang.org/p/zvDiwul9QR0):

所以这里的上下文会在 2 秒后返回一个“Done()”通道。我想抓住这个并取消我的无限 for 循环。上面的代码示例没有这样做,它永远不会退出循环。

我怎样才能做到这一点?

0 投票
1 回答
72 浏览

go - 如何将 goroutine 包含到上下文中?

我正在开发一个需要initFunction在单独的 goroutine 中调用启动函数 ( ) 的 Go 项目(以确保此函数不会干扰项目的其余部分)。initFunction 不得超过 30 秒,所以我想我会使用 context.WithTimeout。最后,initFunction必须能够将错误通知给调用者,所以我想到了创建一个错误通道并从匿名函数中调用 initFunction 来接收并报告错误。

我对 Go 很陌生,所以我要求对上述代码提供反馈。

  1. 我对第 7 行有一些疑问。我用它来确保匿名函数被“包含”在下面ctx,因此被杀死和释放,一旦超时到期,一切都将结束,但我不确定我是否做了正确的事情。
  2. 第二件事是,我知道我应该打电话给cancel( )某个地方,但我无法确定在哪里。
  3. 最后,真的欢迎任何反馈,无论是关于效率、风格、正确性或任何其他方面。
0 投票
0 回答
218 浏览

http - 如何取消传出客户端请求的上下文?

我的代码是这样的:

它输出

这段代码是错误的。上下文将取消当我从 resp.Body 读取数据时,我如何取消上下文,在处理 http 请求期间上下文会自动取消吗?谢谢你。

0 投票
1 回答
110 浏览

go - 如何知道上下文是否已被取消?

如何知道上下文是否已被取消?

在以下示例代码中,

  • 有2个任务。
  • 如果这些任务中的任何一个先完成,我想通过上下文取消了解其他任务。
  • 作为示例的一部分,task2 将始终首先完成(在 task1 之前)。
0 投票
1 回答
177 浏览

multithreading - 防止上下文取消在业务逻辑中间停止函数执行

有没有办法保护业务逻辑的执行免受上下文取消?这是代码片段,可以更好地理解我的问题

输出:

当执行在 for 循环中开始时,它不应该停止,直到它完成该迭代。这可以使用上下文取消吗?或者我应该使用其他方法,请建议。

去游乐场链接