首页 > 其他分享 >Go语言之goroutine + channel 计算素数

Go语言之goroutine + channel 计算素数

时间:2024-06-02 12:59:33浏览次数:19  
标签:wg prime 协程 primechan goroutine exitchan go Go channel

计算素数 通道 协程之间的关系

并发的俩种思想:

  • 第一个通过共享内存,需要锁来保证并发安全。
  • 第二个通过通信来。go语言通过channel. channel是协程安全的。

通道 intchan 来传递要计算的数
通道 primechan 来传递结果是素数
通道 exitchan 来保证计算的协程都完毕

协程 inttochan 给intchan输入 1-120000
协程 prime 从intchan获取数,然后将是素数的数输入给primechan ,计算完毕将 bool true输入给exitchan .
协程 exit 从 exitchan获取数据,达到prime协程的个数,就关闭 primechan
协程 printprime 从 primechan获取数据打印。

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup
var go_sum_prime int = 16 //计算素数的协程数量
func finttochan(ch chan int) {
	defer close(ch) //输出完就关闭
	wg.Add(1)
	for i := 2; i < 120000; i++ {
		ch <- i
	}
	wg.Done()
}

func fprimechan(intchan chan int, primechan chan int, exitchan chan bool) {
	wg.Add(1)
	for v := range intchan {
		flag := true
		for i := 2; i < v; i++ {
			if v%i == 0 {
				flag = false
				break
			}
		}
		if flag {
			primechan <- v
		}
	}
	//计算完毕就输出给exitchan
	exitchan <- true
	wg.Done()
}

func exit(exitchan chan bool, primechan chan int) {
	wg.Add(1)
	for i := 0; i < go_sum_prime; i++ {

		f := <-exitchan
		fmt.Printf("i=%v, --> %v ", i, f)
	}
	close(exitchan)
	close(primechan)
	wg.Done()

}

func printprime(primechan chan int) {
	wg.Add(1)
	for v := range primechan {
		fmt.Println(v)
	}
	wg.Done()

}

func main() {

	inttochan := make(chan int, 50000)
	primechan := make(chan int, 50000)
	exitchan := make(chan bool, go_sum_prime)

	go finttochan(inttochan)

	for i := 0; i < go_sum_prime; i++ {

		go fprimechan(inttochan, primechan, exitchan)
	}

	go printprime(primechan)
	go exit(exitchan, primechan)

	wg.Wait()
}

标签:wg,prime,协程,primechan,goroutine,exitchan,go,Go,channel
From: https://www.cnblogs.com/clllll/p/18226970

相关文章

  • 2.2 Go运行时(runtime)
    2.2.1Go运行时(runtime)尽管Go编译器产生的是本地可执行代码,这些代码仍旧运行在Go的runtime(这部分的代码可以在runtime包中找到)当中。这个runtime类似Java和.NET语言所用到的虚拟机,它负责管理包括内存分配、垃圾回收(第10.8节)、栈处理、goroutine、channel、切片(sli......
  • go程序结构
    1、命名规则名称的开头是字母或者下划线,后面可以跟任意数量的字符、数字或者下划线。区分大小写,hello和Hello是不同的名称实体第一个字母的大小写决定其可见性是否跨包。包名本身总是由小写字母组成名称本身没有长度限制,倾向使用短名称,并且驼峰式风格。2、变量......
  • 【Django技术深潜】揭秘Django定时任务利器:django_apscheduler全面解析与实战
    在现代Web开发中,定时任务是不可或缺的一部分,无论是定期数据分析、定时发送邮件、还是系统维护脚本,都需要精准的定时调度。Django作为Python世界中强大的Web框架,其对定时任务的支持自然也是开发者关注的重点。本文将深入探讨Django定时任务解决方案,特别是聚焦于django_apscheduler......
  • golang json 性能分析
    Json作为一种重要的数据格式,具有良好的可读性以及自描述性,广泛地应用在各种数据传输场景中。Go语言里面原生支持了这种数据格式的序列化以及反序列化,内部使用反射机制实现,性能有点差,在高度依赖json解析的应用里,往往会成为性能瓶颈,从下面的火焰图中可以发现在业务逻辑处理......
  • Django中使用Celery和APScheduler实现定时任务
    在之前的文章我们已经学习了Celery和APScheduler的基本使用,下面让我们来了解一下如何在Django中使用Celery和APSchedulerCelery1.前提工作python3.7pipinstallcelerypipinstalleventlet#5.0版本以下pipinstallimportlib-metadata==4.8.3(python3.7下可能会出现报......
  • Goose Goose Duck(第八届河北省大学生程序设计竞赛)
    #include<bits/stdc++.h>#defineendl'\n'usingll=longlong;typedefunsignedlonglongull;usingnamespacestd;voidGordenGhost();structsb{inta,b,c;};signedmain(){#ifdefGordenfreopen("in.txt","r......
  • MongoDB CRUD操作:批量写操作
    MongoDBCRUD操作:批量写操作文章目录MongoDBCRUD操作:批量写操作关于批量操作的顺序bulkWrite()支持的方法举例向分片集合批量插入的策略预分割集合无序写入mongos避免单调节流MongoDB提供了批量执行写入操作的能力,但批量写入操作只影响单个集合,MongoDB允许应用......
  • go语言电子商场项目
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、前言......
  • go基础入门
    go不需要在语句或声明后面使用分号结尾左括号{必须与关键字func同一行,不能独自成行x+y表达式,换行符可以在+操作符的后面,不能在+操作符的前面go中索引使用半开区间,左开右闭,包含左边索引元素,不包含右边索引元素。var关键字用来声明变量,如果没有明确初始化,会隐式的初......
  • Go-知识并发控制Context
    Go-知识并发控制Context1.介绍2.实现原理2.1接口定义2.2Deadline()2.3Done()2.4Err()2.5Value()3.空context4.cancelCtx4.1Done()4.2Err()4.3cancel()4.4WithCancel4.5例子4.6总结5.timerCtx5.1Deadline5.2cancel5.3WithDeadline5.4WithTimeout5.......