有些语言提供了一种在线程中保留全局变量的方法,该线程保留在该线程中(即该全局的值在该线程内被沙箱化).虽然我知道Goroutines没有线程,但我只是想知道是否有一个类似的方法可供我使用,或者我是否必须通过不同的嵌套例程传递我的会话类型的本地指针.
我猜通道不会这样做?从我可以收集的内容(如果我在这里错了,请纠正我),但它们基本上只是一种共享全局变量的安全方式?
编辑:我忘记了这个问题!无论如何,任何好奇的人的更新.这个问题是在我刚开始使用Go时回写的,CMS基本上是我的第一个项目.我来自熟悉POSIX线程的C背景,但我很快意识到更好的方法是在模式功能设计中编写代码,将会话对象作为函数参数中的指针传递下来.这给了我我所关注的上下文敏感的本地范围,同时也最小化了我复制的数据量.然而,作为一个7岁的项目和一个刚开始转向Go的项目,可以说该项目无论如何都可以进行重大改写,因为有很多错误.这是另一天的关注 – 目前它有效,我有足够的其他项目.
解决方法
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 singleContext
to any number of goroutines and cancel thatContext
to signal all of them.
我有一个实现,我明确地发送变量作为方法参数,我发现使用上下文嵌入这些变量显着清理了我的代码.
使用上下文也有帮助,因为它提供了通过使用通道,选择和称为“完成通道”的概念来结束长时间运行任务的方法.请参阅此文章以获得一个很好的基本评论和实施:
http://blog.golang.org/pipelines
我建议首先阅读管道文章,了解如何管理goroutines之间的沟通,然后上下文文章,以更好地了解如何升级和开始嵌入变量传递.
祝好运!