将包含文件句柄的通道传递给goroutine是一个坏主意吗?

原始文件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中,将gochan一起使用,并通过文件处理程序,这可能是一个问题吗?或者,更令人困惑的是:在golang channel putchannel get中使用指针可能是一个问题;从书本上来说,这是C语言中的“不”。如果golang没问题,golang如何实现?

----更新11/11/2019 10am ----

该问题仅适用于golang。由于node.js是单线程语言,因此不会发生这种问题。这个问题集中在线程和文件处理程序上。实际上,我对问题的了解有限,我很抱歉提出错误的问题或提供错过的领先信息。

----更新于11/11/2019 10:40 am ----

我与同事再次确认,担心的是“每次代码要求一个文件处理程序时,系统都会返回一个数字。但是,该数字仅在一个进程中是唯一的,这意味着在不同的进程中相同的文件处理程序号,可能指向其他资源。我不确定goroutine是否会照顾好它。”

haitv223 回答:将包含文件句柄的通道传递给goroutine是一个坏主意吗?

只要注意以下几点,将连接句柄传递给单独的goroutine并没有错:

  • 请勿在goroutine工作时关闭手柄,或编写goroutine进行处理。
  • 如果您要使用多个goroutine中的句柄,请确保您要处理的连接是线程安全的,或在其周围加锁。
  • 要清楚明确地指出谁将要关闭它。该goroutine可能会在完成后关闭它,或者在完成使用该手柄的所有工作后会关闭另一个goroutine。
本文链接:https://www.f2er.com/3140581.html

大家都在问