实现并发处理素数计算任务,添加工作协程和结果通道

This commit is contained in:
yangyudong 2025-04-18 22:00:52 +08:00
parent 4b77e9cfc0
commit 265eef5627
3 changed files with 84 additions and 2 deletions

View File

@ -1,5 +1,28 @@
package main package main
func main() { import (
// TODO "fmt"
"time"
)
// 模拟一个耗时的计算任务
func heavyTask(id int) {
fmt.Printf("任务 %d 开始执行\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("任务 %d 执行完成\n", id)
}
func main() {
fmt.Println("程序开始...")
// 启动200个goroutine
for i := 1; i <= 200; i++ {
go heavyTask(i)
}
// 主线程等待一段时间确保goroutine有足够时间执行
// 注意:在实际生产环境中应该使用更好的同步机制
time.Sleep(3 * time.Second)
fmt.Println("程序结束...")
} }

View File

@ -0,0 +1,3 @@
module morecon
go 1.24.1

View File

@ -0,0 +1,56 @@
package main
import (
"fmt"
"math"
)
// 判断一个数是否为素数
func isPrime(n int) bool {
if n <= 1 {
return false
}
sqrt := int(math.Sqrt(float64(n)))
for i := 2; i <= sqrt; i++ {
if n%i == 0 {
return false
}
}
return true
}
func worker(id int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Printf("Worker %d processing job %d\n", id, job)
// 计算从job开始的前100个数中有多少个素数
count := 0
for i := job; i < job+100; i++ {
if isPrime(i) {
count++
}
}
results <- count // 将结果发送到results通道
}
}
func main() {
jobs := make(chan int, 100) // 工作通道
results := make(chan int, 100) // 结果通道
// 启动3个工作协程
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 发送工作任务
for j := 1; j <= 80; j++ {
jobs <- j
}
close(jobs)
// 收集结果
for i := 1; i <= 80; i++ {
result := <-results
fmt.Printf("Got result: %d\n", result) // 输出每个范围内的素数个数
}
}