gpt4 book ai didi

multithreading - 通过 golang 中的 channel 进行双向通信

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:50 24 4
gpt4 key购买 nike

我有几个函数,我希望它们以原子方式执行,因为它们处理敏感数据结构。假设以下场景:有两个函数:lock(sth)unlock(sth),goroutine 可以随时调用它们来锁定或解锁 sth全局数组。我正在考虑拥有一个命令 channel ,以便 goroutines 将 lockunlock 命令发送到 channel 中,并在 channel 的接收端,某种 处理程序 通过从 channel 中获取命令,依次处理 lockunlock 请求。这很好,但是如果 handler 想要将结果发送回请求者怎么办?是否可以使用 golang channel 这样做?我知道可以使用某种锁定机制,如互斥锁,但我想知道是否可以为这种用例使用 channel ?我在某处看到建议使用 channel 而不是 goland 低级锁结构。

一句话:

在容量为 1 的 channel 中,我希望接收方能够回复发送消息的 goroutine。

或等同于:

一个协程发送一些东西到一个 channel ;该消息由另一个 goroutine 接收并处理导致某些结果;发件人如何知道结果?

最佳答案

sync 包包含一个互斥锁,sync.Mutex,可以以线程安全的方式从任何 goroutine 锁定和解锁。与其使用 channel 发送命令来锁定某些东西,不如使用来自发送方的互斥锁怎么样?

mutex := new(sync.Mutex)
sensitiveData := make([]string, 0)
// when someone wants to operate on a sensitiveData,
// ...
mutex.Lock()
operate(sensitiveData)
mutex.Unlock()

当您说发送者如何知道结果时,我想您是在谈论处理程序如何接收结果——那就是 chan。您可以通过 channel 发送数据。

或者,如果您只是想知道,信号量sync.WaitGroup 可能会完成这项工作。这个结构可以被 Add() 编辑,然后发送者可以 wg.Wait() 直到处理程序调用 wg.Done() ,这将向发送方(正在等待)指示处理程序已完成此类操作。


如果您的问题是关于是使用锁还是 channel ,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


如果您绝对想避免除 chan 之外的任何内容 :),请尝试不要更改敏感数组。而是使用 channel 将数据发送到不同的 goroutine,在每个步骤处理数据,然后将处理后的数据汇集到最终类型的 goroutine 中。也就是说,完全避免使用数组并将数据存储在 chan 中。

正如座右铭所说,

Do not communicate by sharing memory; instead, share memory by communicating.

关于multithreading - 通过 golang 中的 channel 进行双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44423746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com