我有几个我希望它们原子执行的函数,因为它们处理敏感的数据结构。假设以下情况:
有两个函数:
用一句话:
我希望在容量为1的通道中,接收方能够回复发送消息的goroutine。
或等效地:
goroutine将某些内容发送到通道;该消息被另一个goroutine接收并进行处理,从而导致某些结果;发件人如何得知结果?
当您说发送方如何得知结果时,我认为您是在谈论处理程序如何接收结果-就是
另外,如果您只是想知道,信号量
如果您的问题是关于使用锁还是通道,那么Wiki有一个简洁的答案:
A common Go newbie mistake is to over-use channels and goroutines just because it's possible, and/or because it's fun. Don't be afraid to use a sync.Mutex if that fits your problem best. Go is pragmatic in letting you use the tools that solve your problem best and not forcing you into one style of code.
As a general guide, though:
Channel: passing ownership of data, distributing units of work, communicating async results
Mutex: caches, state
如果您绝对要避免使用
座右铭是
Do not communicate by sharing memory; instead, share memory by communicating.
如果要防止争用情况,则
但是,如果您希望频道为您执行同步,则可以随时尝试以下操作:
要使用此
工作示例:https://play.golang.org/p/Drh-yJDVNh
或者,您可以完全绕过
工作示例:https://play.golang.org/p/me3K6aIoR7
如您所见,
其他问题已经很好地涵盖了锁定,但是我想解决有关使用通道将响应发送回呼叫者的问题的另一部分。 Go中有一种不常见的模式,即与请求一起发送响应通道。例如,您可能通过通道将命令发送给处理程序;这些命令将是具有特定于实现的详细信息的