【发布时间】:2018-07-10 21:03:21
【问题描述】:
我是 golang 新手,正在阅读 gopl 书中的示例。
Go 编程语言一书的第 9.8.4 节解释了为什么 Goroutine 没有程序员可以访问的身份概念
Goroutines 没有程序员可以访问的身份概念。这是设计使然,因为线程本地存储往往被滥用。例如,在以具有线程本地存储的语言实现的 Web 服务器中,许多函数通常通过查看该存储来查找有关它们当前代表其工作的 HTTP 请求的信息。但是,就像过度依赖全局变量的程序一样,这可能会导致不健康的“远距离操作”,其中函数的行为不仅仅由其参数决定,而是由线程的身份决定。它运行。因此,如果线程的身份发生变化——比如说,一些工作线程被征召来提供帮助——函数就会神秘地行为不端。
并以网络服务器为例来说明这一点。但是,我很难理解为什么所谓的“远距离行动”是一种不好的做法,以及这如何导致
一个函数不仅仅由它的参数决定,而是由它运行的线程的标识决定。
谁能解释一下(最好是短代码sn-ps)
感谢任何帮助!
【问题讨论】:
-
正是这样:鉴于您没有任何其他方式来识别它 - 您必须通过参数明确地做到这一点。和往常一样 - 显式优于隐式。
-
这是语言作者的设计决定。在设计语言甚至不允许这种使用的大型代码库中,线程标识很容易被误用。