返回顶部
首页 > 资讯 > 后端开发 > GO >Golang复制上下文的所有值
  • 825
分享到

Golang复制上下文的所有值

2024-02-06 05:02:55 825人浏览 安东尼
摘要

问题内容 我有一个提供异步作业服务的 Http 服务器应用程序。 -> Request --> Do async job with Goroutine Job1

问题内容

我有一个提供异步作业服务的 Http 服务器应用程序。

-> Request
   --> Do async job with Goroutine
<- Response
    -------start goroutine------
       -> Job1
          -> Job1A
          -> Job1B
       -> Job2
       -> Job3

用户可以请求长时间运行的异步作业,应用程序在 make goroutine 后立即响应该请求。

我将请求 ID、经过身份验证的令牌和用户信息放入请求的 context.Context 中。而且,我想把它放在 goroutine 下。但是,对请求 context 使用相同的 context 将导致响应后意外取消,这不是我的预期行为。

如何生成具有所有值的新 context,独立于父请求 context?或者,还有其他方法可以保证 context 带入 goroutine 的响应后不会死吗?

还有一个额外问题:

Job1 ~ Job3 应该被序列化,即 Job2 应该等待 Job1Job3 等待 Job2。并且,Job1AJob1B 可以同时运行。如果我想传播给定 context 的取消,我怎样才能取消它们的路径(?)?我应该检查所有函数的 select 语句吗?

我理解了 context 传播取消和提前退出的概念,而不执行无意义的任务。但是,我还没有明白如何在代码中进行处理。如果有人能帮助理解,我会很高兴。


正确答案


无法发现上下文中的值。它们不存储为地图,而是存储为上下文层,每个级别可能提供值存储方式的不同实现。

但是,如果您知道需要传播哪些值,则可以查询它们并使用这些值创建新上下文。

也就是说,您可以实现一个使用另一个上下文中的值的新上下文类型:

type newContext struct {
  context.Context
  values context.Context
}

func (c newContext) Value(key any) any {
  return c.values.Value(key)
}

...
newCtx:=newContext{
  Context: context.Background(),
  values: ctx,
}

这使用现有的值上下文和其他所有内容的新上下文。

然后,启动一个新的 goroutine 以继续使用新上下文处理请求。

如果你想创建多个并发作业,你可以在该 goroutine 中执行此操作:

go func(ctx context.Context) {
   withCancel, cancel:=context.WithCancel(ctx)
   defer cancel()

   wg:=sync.WaitGroup{}
   wg.Add(2)
   go job1(withCancel,&wg)
   go job2(withCancel,&wg)
   wg.Wait()
}(newCtx)

这样,当上下文被取消时,两个作业都会收到取消通知。如果想分别控制job1和job2的取消:

go func(ctx context.Context) {
   withCancel1, cancel1:=context.WithCancel(ctx)
   defer cancel1()
   withCancel2, cancel2:=context.WithCancel(ctx)
   defer cancel2()

   wg:=sync.WaitGroup{}
   wg.Add(2)
   go job1(withCancel1,&wg)
   go job2(withCancel2,&wg)
   wg.Wait()
}(newCtx)

对于连续作业(即 job3 在 job1 之后完成),只需将它们组合起来,使它们看起来像一个作业。

要检查上下文是否被取消,您可以在上下文的 Done 通道上执行 select ,或者简单地检查:

if ctx.Err()!=nil {
   // Context canceled
}

以上就是golang复制上下文的所有值的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang复制上下文的所有值

本文链接: https://lsjlt.com/news/561239.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang复制上下文的所有值
    问题内容 我有一个提供异步作业服务的 HTTP 服务器应用程序。 -> Request --> Do async job with goroutine Job1 ...
    99+
    2024-02-06
  • BeanUtils.copyProperties()所有的空值不复制问题
    目录BeanUtils.copyProperties()所有的空值不复制第一种情况第二种情况BeanUtils.copyProperties()的用法和注意点属性为null也会被复制...
    99+
    2024-04-02
  • Golang 构建所有下载的包
    哈喽!大家好,很高兴又见面了,我是编程网的一名作者,今天由我给大家带来一篇《Golang 构建所有下载的包》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面...
    99+
    2024-04-04
  • BeanUtils.copyProperties()所有的空值不复制问题怎么解决
    本文小编为大家详细介绍“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“BeanUtils.copyProperties()所有的空值不复制问题怎么解决”文章能...
    99+
    2023-07-02
  • Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
    实现代码一: var fs = require('fs') var path = require('path') var copyFile = function(srcPath, tarPath, ...
    99+
    2022-06-04
    递归 文件夹 文件
  • f.strength 的单值上下文解析
    最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《f.strength 的单值上下文解析》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在...
    99+
    2024-04-04
  • 单值上下文中的多值“crypto/rand”.Int()
    哈喽!今天心血来潮给大家带来了《单值上下文中的多值“crypto/rand”.Int()》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Gol...
    99+
    2024-04-05
  • linux如何复制一个目录下的所有文件到当前工作目录
    这篇文章将为大家详细讲解有关linux如何复制一个目录下的所有文件到当前工作目录,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux下复制目录内容到当前目录的命令 前提条件: 需要具有源目录和目标目...
    99+
    2024-04-02
  • 怎么使用Golang递归获取目录下所有文件
    这篇文章主要讲解了“怎么使用Golang递归获取目录下所有文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Golang递归获取目录下所有文件”吧!1.问题如果我想获取一个目录下的所...
    99+
    2023-07-05
  • Golang递归获取目录下所有文件方法实例
    目录1.问题2.io/ioutil3.递归获取4.包含符号链接的情况5.同时返回目录的路径6.go-huge-util参考文献总结1.问题 如果我想获取一个目录下的所有文件列表,使用...
    99+
    2023-02-27
    golang 递归 golang遍历文件夹 golang 遍历目录
  • golang的协程上下文的具体使用
    go协程上下文context golang的context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等 context是gol...
    99+
    2024-04-02
  • Python遍历文件夹下所有文件的方法
    在这里跟大家分享一个Python编程过程中的知识点——遍历文件夹下所有文件! 在python中,遍历文件夹及其子文件夹中的所有文件有两种方法。 两者均返回文件名列表(可以选择文件名列表或者是包含完整路径的文件名列表)。 一种是使用...
    99+
    2023-01-31
    遍历 文件夹 文件
  • Golang上下文Context的常见应用场景
    目录Context类型emptyCtxcancelCtxcanceler接口timerCtxvalueCtx函数默认上下文Background()TODO()取消信号WithCanc...
    99+
    2023-05-16
    Golang Context应用场景 Golang Context上下文 Golang Context
  • ubuntu如何复制windows下的文件
    在Ubuntu中复制Windows下的文件,可以通过以下步骤进行操作:1. 首先,确保你的Ubuntu系统已经安装了NTFS文件系统...
    99+
    2023-09-08
    ubuntu windows
  • Linux协程的上下文切换机制
    在Linux系统中,协程的上下文切换是通过使用setjmp和longjmp函数实现的。 setjmp函数用于保存当前函数的执行环境,并返回0;longjmp函数用于恢复之前保存的执行环境,并返回到setjmp函数的调用点。这样可以实现协...
    99+
    2024-08-06
    linux
  • phpstudy怎么访问www文件夹下的所有文件
    对初学者,想要访问www文件下的所有文件,要怎么设置。 第一步:进入网站--->管理--->修改--->高级配置--->打开目录索引: 第二步:进入设置--->配置文件--->httpd.conf--->打开apache 在记事本中把红...
    99+
    2023-09-16
    php mysql nginx
  • java如何获取文件夹下的所有文件名
    可以使用Java的File类来获取文件夹下的所有文件名。以下是一个示例代码: import java.io.File; publi...
    99+
    2024-04-02
  • python 如何获取页面所有a标签下href的值
    看代码吧~ # -*- coding:utf-8 -*- #python 2.7 #http://tieba.baidu.com/p/2460150866 #标签操作 from bs4 import Bea...
    99+
    2022-06-02
    python 页面a标签 href值
  • 在 golang 中创建静态二进制文件所需的标志
    编程网今天将给大家带来《在 golang 中创建静态二进制文件所需的标志》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希...
    99+
    2024-04-04
  • Vista系统下复制文件提速的妙招有哪些
    这篇文章将为大家详细讲解有关Vista系统下复制文件提速的妙招有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。使用Vista系统的用户可能都会有这样的感觉,那就是文件拷贝和XP相比明显较...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作