原始文件2019年9月11日
conn := createConnection() // or a file handle
go getData(conn)
是否getData
的线程位于conn
句柄的不同线程中。因此,它可能导致连接错误。
----更新11/11/2019 09am ----
Senario 1
func createConnection() handler {
... create a socket connection (tcp://.....) or file open handler
return conn
}
func sendData(conn handler,data string) {
conn.send(data)
}
conn := createConnection() // or a file handle
go sendData(conn,"test data")
Senario 2
func createConnection() handler {
... create a socket connection (tcp://.....) or open file handler
return conn
}
func sendData(ch chan handler,data string) {
conn := <- ch
conn.send(data)
}
ch := make(chan conn,10)
ch <- createConnection() // or a file handle
go sendData(ch,"test data")
故事背后:
我正在执行一项任务,将数据代理到套接字服务器。我针对挑战的解决方案是使用[Senario 2]的想法。
我的同事中很少有人使用C语言进行系统级编程。他们指出,golang channel
最好只包含数据-将文件处理程序放在通道中可能会导致未知的问题,例如:channel get
的线程位于channel put
的不同线程中,因此,文件处理程序也可能会丢失。
据我了解,golang应该已经可以自己解决问题了。然后,我问了以上问题。
通过研究与套接字相关的项目的一些源代码,我认为[Senario 1]很好。但是,[Senario 2]仍然是我的问题。
同样,我的问题不是[我可以将文件句柄传递给函数吗],每个人都知道“这是肯定的”。问题是在golang CSP中,将go
和chan
一起使用,并通过文件处理程序,这可能是一个问题吗?或者,更令人困惑的是:在golang channel put
和channel get
中使用指针可能是一个问题;从书本上来说,这是C语言中的“不”。如果golang没问题,golang如何实现?
----更新11/11/2019 10am ----
该问题仅适用于golang。由于node.js是单线程语言,因此不会发生这种问题。这个问题集中在线程和文件处理程序上。实际上,我对问题的了解有限,我很抱歉提出错误的问题或提供错过的领先信息。
----更新于11/11/2019 10:40 am ----
我与同事再次确认,担心的是“每次代码要求一个文件处理程序时,系统都会返回一个数字。但是,该数字仅在一个进程中是唯一的,这意味着在不同的进程中相同的文件处理程序号,可能指向其他资源。我不确定goroutine是否会照顾好它。”