go并发实现素数筛的代码
作者:kelianlee 发布时间:2024-04-27 15:38:03
标签:go,素数筛,并发
先贴代码
package main
import (
"fmt"
)
// Send the sequence 2, 3, 4, ... to channel 'ch'.
func generate(ch chan int) {
for i := 2; ; i++ {
ch <- i // Send 'i' to channel 'ch'.
}
}
// Copy the values from channel 'in' to channel 'out',
// removing those divisible by 'prime'.
func filter(in, out chan int, prime int) {
for {
i := <-in // Receive value of new variable 'i' from 'in'.
if i == 4{
fmt.Println(prime)
}
if i%prime != 0 {
out <- i // Send 'i' to channel 'out'.
}
}
}
// The prime sieve: Daisy-chain filter processes together.
func main() {
ch := make(chan int) // Create a new channel.
go generate(ch) // Start generate() as a goroutine.
for i:=0;i<10;i++ {
prime := <-ch
fmt.Println(&ch)
fmt.Print(prime, " ")
ch1 := make(chan int)
go filter(ch, ch1, prime)
ch = ch1
}
}
第一次看这个素数筛一脸懵逼,首先我们要理解不是并发的素数筛,这个自行百度。
接下来我们看张图
这就是上面算法的流程图,我刚开始很难的理解是:为什么generate产生的2,3,4,5....等数一定是先被2筛选呢?我们知道并发有个不确定性,我们如果把generate函数当作生产者,那么2,3,5,7这几个素数过滤器协程就是消费者,根据一般的消费者生产模型,生产者产生的2,3,4,5等各个数被消费者使用的时候应该是不确定性的。
这里的关键在于generate这个channel只连接了2这个协程,并没有跟后面的协程相连接,而最秒的地方在于后面的每个协程的channel都只是与前后的协程相互通信的,这样就达到了一个串联的效果。
关键看代码filter函数的参数in,out这两个channel,in是上一个协程与当前协程所建立的channel,out则是当前协程与下一个协程所建立的channel(因为看main里面ch=ch1)
来源:https://blog.csdn.net/leekerian/article/details/114832843
0
投稿
猜你喜欢
- 前言其实Beautiful Soup 模块除了能够搜索和导航之外,还能够修改 HTML/XML 文档的内容。这就意味着能够添加或删除标签、修
- 1.INPUT和图片按钮对齐:<form method="post" action="
- 目录前言typeof是否能正确判断类型?instanceof是否能正确判断类型?Object.prototype.toString.call
- 希望在自己的机器模拟一下公司中微服务的构建,使用docker部署了mysql实例,使用spring boot进行了CRUD(增删改查)操作进
- 一、效果图如下二、使用步骤1.创建并配置一个django项目1.1新建一个项目ch3django-admin startproject ch
- 1. 递归1.1 定义函数作为一种代码封装, 可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。
- 前言孙悟空在花果山称王的时候,特意去了一趟东海,在那里淘到了如意金箍棒。因为身为一个山大王,怎么能没有一件趁手的兵器呢?作为程序员的我们也一
- 引用PyMongo>>> import pymongo创建连接Connection>>> import
- 前面写过一篇关于python多线程的实现的文章, 但是效果不是最佳的,写法也不是很好。通过网上学习,也了解到了semaphore这个东西。百
- 最近笔者学会了用FrontPage XP做网页,心理特高兴,非常想把我在制作主页过程中的一些经验和大家交流交流、切磋切磋,我们一起来看看吧。
- 今天开始学习python,首先环境安装1.在https://www.python.org/downloads/下载python2.X或者3.
- 目录前言sql_mode详解最重要的选项全部选项总结前言相信看过上一篇文章《MySQL案例:一个数据丢失 * 》的童鞋,都应该意识到,sql_
- bootstrap-confirmation按钮提示组件,它类似于js里面confirm的功能,界面更加美观。介绍这个组件之前,可以先来看看
- 进程进程是操作系统分配资源的基本单元,是程序隔离的边界。进程和程序程序只是一组指令的集合,它本身没有任何运行的含义,它是静态的。进程程序的执
- 1.python爬虫浏览器伪装#导入urllib.request模块import urllib.request#设置请求头headers=(
- 首先检查MySQL 服务没有启动》如果没有启动,则要启动这个服务。有时候安装mysql后使用mysql命令时报错 Can'
- JavaScript中的XMLHttpRequest和XML DOM首先,我们需要建立一些规则。特殊的XMLHttpRequest对象和一般
- 本文实例讲述了C#使用ODBC与OLEDB连接数据库的方法。分享给大家供大家参考,具体如下:using System;using Syste
- 1.1 简介开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。1.2 登
- 前言在日常开发工作中,我经常会遇到需要统计总数的场景,比如:统计订单总数、统计用户总数等。一般我们会使用MySQL 的count函数进行统计