实现并发处理素数计算任务,添加工作协程和结果通道
This commit is contained in:
parent
4b77e9cfc0
commit
265eef5627
@ -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("程序结束...")
|
||||||
}
|
}
|
||||||
|
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