以惯用方式创建带有额外标志的频道

断续器我希望具有这样的功能:通道有两个额外的字段,告诉生产者是否允许它发送到频道,如果允许,告诉生产者消费者期望什么价值。虽然我知道如何使用共享记忆来做到这一点,但我相信这种方法违背了Go的意识形态“不要通过共享记忆进行交流;相反,通过通信来分享记忆。


上下文:


我希望有一个服务器S运行(除了其他人)三个戈鲁丁:


仅接收 UDP 数据包并将其发送到解复用器的侦听器。

解复用器,它接受网络数据包并根据一些数据将其发送到几个通道之一

侦听一个特定通道并处理在该通道上接收的数据的处理任务。

为了检查网络上的某些设备是否仍然处于活动状态,处理任务将定期通过网络发送nonces,然后等待k秒。在这 k 秒内,我的协议中收到 nonce 的其他参与者将发送包含(除其他信息外)nonce 的回复。解复用器将从侦听器接收数据包,对其进行解析并将其发送到 .经过 k 秒后,处理任务将处理由解复用器推送到 上的消息。processing_channelprocessing_channel


我希望解复用器不仅盲目地将它收到的任何响应(正确类型)发送到 ,而是检查处理任务当前是否甚至期望任何消息,如果是,它期望哪个 nonce 值。我做出这个设计决定是为了尽快丢弃不需要的数据包。processing_channel


我的方法:


在其他语言中,我会有一个具有以下字段的类(在伪代码中):


class ActivatedChannel{

    boolean    flag_expecting_nonce;

    int        expected_nonce;

    LinkedList chan;

}

然后,解复用器在收到正确类型的数据包后,只需获取对象的锁,检查是否设置了标志并且 nonce 匹配,如果是这样,则将消息添加到 !ActivatedChannel processing_channelLinkedList chan


问题:


这种方法利用了锁和共享内存,这与Golang的“不要通过共享内存进行通信;相反,通过沟通来分享记忆“的口头禅。因此,我想知道... :


...我的方法是否对Go的“坏”,因为它依赖于共享内存。

...如何以更像Go的方式实现概述的结果。


交互式爱情
浏览 78回答 1
1回答

慕侠2389804

是的,您描述的方法与Golang的惯用实现方式不一致。你已经正确地指出,在上述方法中,你是通过共享记忆来沟通的。为了以围棋的惯用方式实现这一目标,其中一种方法可能是你的“记住”所有期待nonce和相应类型的nonce。每当 a 准备好接收回复时,它都会向该消息发送一个信号,表明它正在等待回复。Demultiplexerprocessing_channelsprocessing_channelsDemultiplexe由于处于所有通信的中心,因此它可以维护它期望的相应随机数之间的映射。它还可以维护所有期待回复的“注册表”。Demultiplexerprocessing_channelprocessing_channels在这种方法中,我们是Sharing memory by communicating要传达 a 需要回复的信息,可以使用以下命令:processing_channelstructtype ChannelState struct {     ChannelId        string // unique identifier for processing channel     IsExpectingNonce bool     ExpectedNonce    int     }在此方法中,不使用锁。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go