实现并发处理素数计算任务,添加工作协程和结果通道
This commit is contained in:
parent
4b77e9cfc0
commit
265eef5627
@ -1,5 +1,28 @@
|
||||
package main
|
||||
|
||||
func main() {
|
||||
// TODO
|
||||
import (
|
||||
"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("程序结束...")
|
||||
}
|
||||
|
3
02_core_concepts/05_concurrency/04_more/go.mod
Normal file
3
02_core_concepts/05_concurrency/04_more/go.mod
Normal file
@ -0,0 +1,3 @@
|
||||
module morecon
|
||||
|
||||
go 1.24.1
|
56
02_core_concepts/05_concurrency/04_more/main.go
Normal file
56
02_core_concepts/05_concurrency/04_more/main.go
Normal 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) // 输出每个范围内的素数个数
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user