algorithm - 在 goroutine 中设置广播和多接收
问题描述
我正在尝试在 Go 中模拟Ben-Or 算法,但我无法弄清楚如何在多个 goroutine 之间广播和接收消息。
我为每个处理器实现了一个不同的 goroutine (SimulateOneProc),并希望为每个处理器发送一条消息。然后处理器从所有其他处理器(包括它自己)接收发送的消息并继续。
func SimulateBenOr(n, t int) {
processes := initProcesses(n)
messages := make(chan Message)
ratifier := make(chan Message)
for i := range processes {
go simulateOneProc(n, t, processes[i], messages, ratifier)
}
fmt.Scanln()
}
func simulateOneProc(n, t int, process Process, messages chan Message, ratifier chan Message) {
fmt.Println("starting round", process.round, "for processor", process.id)
var message1 Message
message1.pref = process.pref
message1.round = process.round
// send this process's preference and round
go func(message1 Message, messages chan Message) {
for i := 1; i <= n; i++ {
fmt.Println("sending message", process.pref, "from processor", process.id)
messages <- message1
}
}(message1, messages)
// wait for n-t messages
for i := 1; i <= n; i++ {
newMessage := <-messages
fmt.Println("recieved message", newMessage.pref, "by processor", process.id)
}
}
我尝试为每个处理器使用一个发送和 n 个接收,但这不起作用。我尝试发送和接收 n 次,但这会导致特定处理器多次接收同一消息,而其他一些接收则为空。做这个的最好方式是什么?我是并行编程的初学者,所以对于我所犯的任何基本错误,我深表歉意。
解决方案
推荐阅读
- amazon-web-services - AWS Codecommit Markdown 嵌入图片 图片
- sql - 为sql中的每个公司和域分配最大计数公司
- vb.net - 在 datagridview (vb.net) 中,RowLeave 在行的最后一个单元格中的 CellEndEdit 之前触发
- javascript - 在 Nodejs 中,数组的串联是如何工作的?
- javascript - 添加/删除导航栏折叠显示类时切换正文类
- java - 如何在 JFrame 上显示两个带有图像的 JPanel,并且两个 img 都可见?
- java - 有没有办法为存储到 RavenDB 的 Java bean 指定集合名称?
- php - 如何使用 Symfony 4 限制视图中的字符?(character_limiter CodeIgniter)
- javascript - Thymeleaf HREF 服务器上下文
- python-3.x - Argparse 互斥组不适用于一对位置和可选参数