为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2022-09-26 14:51:03
断续器我希望具有这样的功能:通道有两个额外的字段,告诉生产者是否允许它发送到频道,如果允许,告诉生产者消费者期望什么价值。虽然我知道如何使用共享记忆来做到这一点,但我相信这种方法违背了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的方式实现概述的结果。
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

是的,您描述的方法与Golang的惯用实现方式不一致。你已经正确地指出,在上述方法中,你是通过共享记忆来沟通的。

为了以围棋的惯用方式实现这一目标,其中一种方法可能是你的“记住”所有期待nonce和相应类型的nonce。每当 a 准备好接收回复时,它都会向该消息发送一个信号,表明它正在等待回复。Demultiplexerprocessing_channelsprocessing_channelsDemultiplexe

由于处于所有通信的中心,因此它可以维护它期望的相应随机数之间的映射。它还可以维护所有期待回复的“注册表”。Demultiplexerprocessing_channelprocessing_channels

在这种方法中,我们是Sharing memory by communicating

要传达 a 需要回复的信息,可以使用以下命令:processing_channelstruct

type ChannelState struct {
    ChannelId        string // unique identifier for processing channel
    IsExpectingNonce bool
    ExpectedNonce    int
    }

在此方法中,不使用锁。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信