微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

去没有goroutines覆盖的全局变量

我在Go中编写CMS并具有会话类型(用户ID,要呈现的页面内容等).理想情况下,我希望该类型是一个全局变量,所以我不必通过所有嵌套函数传播它,但是有一个像这样的全局变量显然意味着每个新会话都会覆盖它的前任,这对于不必要的说,这将是一个史诗般的失败.

有些语言提供了一种在线程中保留全局变量方法,该线程保留在该线程中(即该全局的值在该线程内被沙箱化).虽然我知道Goroutines没有线程,但我只是想知道是否有一个类似的方法可供我使用,或者我是否必须通过不同的嵌套例程传递我的会话类型的本地指针.

我猜通道不会这样做?从我可以收集的内容(如果我在这里错了,请纠正我),但它们基本上只是一种共享全局变量的安全方式?

编辑:我忘记了这个问题!无论如何,任何好奇的人的更新.这个问题是在我刚开始使用Go时回写的,CMS基本上是我的第一个项目.我来自熟悉POSIX线程的C背景,但我很快意识到更好的方法是在模式功能设计中编写代码,将会话对象作为函数参数中的指针传递下来.这给了我我所关注的上下文敏感的本地范围,同时也最小化了我复制的数据量.然而,作为一个7岁的项目和一个刚开始转向Go的项目,可以说该项目无论如何都可以进行重大改写,因为有很多错误.这是另一天的关注 – 目前它有效,我有足够的其他项目.

解决方法

你会想要使用像Context这样的东西:

http://blog.golang.org/context

基本上,模式是为您想要做的每件事创建一个Context. (在您的情况下是Web请求.)使用context.WithValue在上下文中嵌入多个变量.然后总是将它作为第一个参数传递给在其他goroutine中进一步工作的其他方法.

从上下文中获取所需的变量是调用context.Value来自任何goroutine.从以上链接

A Context is safe for simultaneous use by multiple goroutines. Code can pass a single Context to any number of goroutines and cancel that Context to signal all of them.

我有一个实现,我明确地发送变量作为方法参数,我发现使用上下文嵌入这些变量显着清理了我的代码.

使用上下文也有帮助,因为它提供了通过使用通道,选择和称为“完成通道”的概念来结束长时间运行任务的方法.请参阅此文章以获得一个很好的基本评论和实施:

http://blog.golang.org/pipelines

我建议首先阅读管道文章,了解如何管理goroutines间的沟通,然后上下文文章,以更好地了解如何升级和开始嵌入变量传递.

祝好运!

原文地址:https://www.jb51.cc/java/128418.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐