MPG(Message Passing Game)模式是一种并发模式,它将问题分解成多个任务,并通过消息传递来实现任务之间的通信。在Go语言中,可以使用goroutine和channel来实现MPG模式。
package main
import (
"fmt"
"time"
)
func main() {
// 创建任务通道和结果通道
tasks := make(chan int)
results := make(chan int)
// 启动3个goroutine作为worker,用来执行任务
for i := 0; i < 3; i++ {
go worker(tasks, results)
}
// 发送任务
go sendTasks(tasks)
// 接收结果
for i := 0; i < 10; i++ {
prime := <-results
fmt.Printf("Prime number: %d\n", prime)
}
// 关闭通道
close(tasks)
close(results)
}
// worker函数,用来执行任务
func worker(tasks <-chan int, results chan<- int) {
for task := range tasks {
if isPrime(task) {
results <- task
}
}
}
// sendTasks函数,用来发送任务
func sendTasks(tasks chan<- int) {
for i := 2; ; i++ {
tasks <- i
}
}
// 判断一个数是否为素数
func isPrime(n int) bool {
if n <= 1 {
return false
}
for i := 2; i <= n/2; i++ {
if n%i == 0 {
return false
}
}
return true
}
在这个例子中,创建了一个任务通道(tasks)和一个结果通道(results)。然后通过启动3个worker goroutine来执行任务。worker函数从任务通道中接收任务,判断任务是否为素数,如果是素数则将结果发送到结果通道中。sendTasks函数不断地生成任务并发送到任务通道中。最后,主函数从结果通道中接收10个素数并打印出来。
通过MPG模式,我们可以将计算任务分布到多个worker中并行执行,提高了程序的性能和效率。