在go中是否可能:假设,我有3个并发例程,它们可以相互发送整数。现在,假设两个并发例程2 &并发例程3发送一个整数给并发例程1。在go中,例程1是否可能同时取两个值并进一步处理它?为了说清楚,我有以下代码:
package main
import "rand"
func Routine1(command12 chan int, response12 chan int, command13 chan int, response13 chan int ) {
for i := 0; i < 10; i++ {
i := rand.Intn(100)
if i%2 == 0 {
command12 <- i
}
if i%2 != 0 {
command13 <- i
}
print(<-response13, " 1stn");
}
close(command12)
}
func Routine2(command12 chan int, response12 chan int, command23 chan int, response23 chan int) {
for i := 0; ; i++ {
x, open := <-command12
if !open {
return;
}
print(x , " 2ndn");
y := rand.Intn(100)
if i%2 == 0 {
command12 <- y
}
if i%2 != 0 {
command23 <- y
}
}
}
func Routine3(command13 chan int, response13 chan int, command23 chan int, response23 chan int) {
for i := 0; ; i++ {
x, open := <-command13
if !open {
return;
}
print(x , " 3ndn");
y := rand.Intn(100)
response23 <- y
}
}
func main() {
command12 := make(chan int)
response12 := make(chan int)
command13 := make(chan int)
response13 := make(chan int)
command23 := make(chan int)
response23 := make(chan int)
go Routine1(command12, response12,command13, response13 )
Routine2(command12, response12,command23, response23)
Routine3(command13, response13,command23, response23 )
}
在这个例子中,例程1可以向例程2或3发送一个int值。我想这是例行公事。现在假设,例程3也向例程2发送一个int。例程2是否有可能采用这两个值并进一步处理(动态并发例程)?任何人都可以帮助修改这个程序。
我讨厌抽象的例子,无论如何我会尽力回答你的问题。
是否可能在go中,例程1同时取两个值并进一步处理它?
你想存档什么?在routine1中,你可以这样做:
// Read exactly one command from routine2 as well as exactly
// one command from routine3
cmd1 := <-command12
cmd2 := <-command13
// Process the pair of the two commands here
或
// Process a single command only, which was either sent by routine2
// or by routine3. If there are commands available on both channels
// (command12 and command13) the select statement chooses a branch
// fairly.
select {
case cmd1 := <-command12:
// process command from routine 2
case cmd2 := <-command13
// process command from routine 3
}
我希望这将回答你的问题。还要注意,Go通道默认情况下支持多个写入器(以及多个读取器)。因此,每个程序只使用一个输入通道可能就足够了。例如,routine1可能只从名为command1的通道读取命令,但routine2和routine3可能都使用相同的command1通道向routine1发送消息。
Go中另一个常见的习惯用法是将回复通道作为消息的一部分传递。例如:
type Command struct {
Cmd string
Reply chan-> int
}
func routine2() {
reply := make(chan int)
command1 <- Command{"doSomething", reply}
status := <-reply
}
func routine1() {
cmd <- command1;
// process cmd.Cmd
cmd.Reply <- 200 // SUCCESS (status code)
}
根据您的实际问题,这可能会大大简化您的程序:)
这在GO中是不可能的,我的意思是创建并发通道