返回顶部
首页 > 资讯 > 后端开发 > GO >go并发实现素数筛的代码
  • 368
分享到

go并发实现素数筛的代码

GO素数 2022-06-07 20:06:50 368人浏览 独家记忆
摘要

先贴代码 package main import ( "fmt" ) // Send the sequence 2, 3, 4, ... to channel 'ch'. f

先贴代码


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)


您可能感兴趣的文档:

--结束END--

本文标题: go并发实现素数筛的代码

本文链接: https://lsjlt.com/news/30656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • go并发实现素数筛的代码
    先贴代码 package main import ( "fmt" ) // Send the sequence 2, 3, 4, ... to channel 'ch'. f...
    99+
    2022-06-07
    GO 素数
  • go并发如何实现素数筛
    这篇文章主要介绍了go并发如何实现素数筛,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先贴代码package main import (&quo...
    99+
    2023-06-14
  • shiro并发人数登录控制的实现代码
    在某些项目中可能会遇到如每个账户同时只能有一个人登录或几个人同时登录,如果同时有多人登录:要么不让后者登录;要么踢出前者登录(强制退出)。比如spring security就直接提供了相应的功能;Shiro的话没有提供默认实现,不过可以很容...
    99+
    2023-05-31
    shiro 并发 人数
  • GO语言并发编程学习笔记:如何打包你的代码并实现并发执行?
    Go语言是一种开源的编程语言,由Google公司开发。它是一种高效的编程语言,特别适合开发并发程序。Go语言的并发编程能力是其最大的特点之一。在本文中,我们将介绍如何使用Go语言来打包代码并实现并发执行。 并发和并行 在讨论并发编程之...
    99+
    2023-07-01
    打包 并发 学习笔记
  • C#代替go采用的CSP并发模型实现
    目录CSP(Communicating sequential processes)在Go中的CSP协程(提升并发的利器)线程线程的开销回归协程协程的目的C#中的协程C#中的CSPGo...
    99+
    2024-04-02
  • 使用golang中的sync.Mutex函数实现并发安全的代码
    使用golang中的sync.Mutex函数实现并发安全的代码在并发编程中,当多个goroutine同时访问共享变量时,可能会发生数据竞争的情况。为了保证数据的一致性和正确性,我们可以使用互斥锁(Mutex)来实现并发安全的代码。Golan...
    99+
    2023-11-18
    Golang 并发安全 syncMutex
  • 深入Go语言:并发编程的实用代码演示
    深入Go语言:并发编程的实用代码演示 在当今互联网时代,并发编程已经成为软件开发中不可或缺的重要技术。而Go语言作为一门并发性能优越的编程语言,其提供了丰富而强大的并发编程特性,让开发...
    99+
    2024-03-04
    go语言 并发编程 实用代码
  • Go并发编程实现数据竞争
    目录1.前言 2.数据竞争 2.1 示例一 2.2 循环中使用goroutine引用临时变量 2.3 引起变量共享 2.4 不受保护的全局变量 2.5 未受保护的成员变量 2.6 接...
    99+
    2024-04-02
  • Redis实现验证码发送并限制每日发送次数的示例代码
    目录1、功能2、分析3、实现1、功能 输入手机号,点击发送后随机生成六位数字码,2分钟有效输入验证码,点击验证,返回成功或失败每个手机号每天只能输3次 2、分析 每个手机每天只能输3...
    99+
    2024-04-02
  • Flutter实现自定义筛选框的示例代码
    目录一、首先自定义筛选框的按钮视图,布局很简单,一个listView就可以搞定。二、定义筛选数据展示列表视图。一、首先自定义筛选框的按钮视图,布局很简单,一个listView就可以搞...
    99+
    2024-04-02
  • Python使用asyncio包处理并发的实现代码
    使用 asyncio 包处理并发 asyncio包:使用事件循环驱动的协程实现并发。 线程与协程的对比 '\ thinking' 旋转等待效果 In [1]: imp...
    99+
    2022-12-08
    Python asyncio包 Python asyncio包处理并发
  • pandas实现数据合并的示例代码
    目录一、 concat--数据合并1.1 概述1.2 指定合并的轴方向--axis1.3 指定合并轴另外一个轴标签是否合并--join1.4 指定合并轴原标签是否需要变化--igno...
    99+
    2024-04-02
  • 如何实现并发数据库压力测试的shell脚本代码
    这篇文章给大家分享的是有关如何实现并发数据库压力测试的shell脚本代码的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下:#!/bin/bash#******************************...
    99+
    2023-06-09
  • 实现并发安全的Go语言map
    实现并发安全的Go语言map 随着并发编程的普及,Go语言成为了许多程序员的首选语言之一。在并发编程中,map是一个常用的数据结构。但是在多个goroutine同时对map进行读写操作...
    99+
    2024-04-02
  • Linux硬盘合并的实现代码
    目的 将两块空硬盘合并为“一块”,挂载到指定目录下,达到在一个目录使用2块硬盘所有空间的效果。 条件 硬盘1 /dev/sdb 硬盘2 /dev/sdc 方法 创建pv pvcreate /dev/...
    99+
    2022-06-04
    Linux 硬盘合并
  • go goroutine实现素数统计的示例
    统计1-120000的素数 1、分析可以通过分段,go协程来实现2、协程1统计1---300003、协程2统计30001---600004、协程3统计60001---900005、协...
    99+
    2024-04-02
  • Go语言中如何实现并发?
    Go语言作为一门新兴的编程语言,其最大的特点之一就是并发编程,它可以轻松地实现高并发的任务。那么,Go语言中如何实现并发呢?本文将为您详细解答。 goroutine goroutine是Go语言中的轻量级线程,它可以在一个单独的线程中...
    99+
    2023-09-30
    并发 shell bash
  • 了解 Go 语言中的并发语法和代码风格
    在现代软件开发中,高并发是一个非常普遍的问题。而在处理高并发任务方面,Go 语言以其强大的并发特性而闻名。Go 语言拥有独特的并发机制,使开发者能够轻松地编写高效的并发程序。本文将介绍...
    99+
    2024-04-02
  • Go语言并发爬虫的具体实现
    目录写在前面1. 单线程爬虫2. 多线程爬虫2.1 channel main函数2.2 sync.WaitGroup3. 源码地址写在前面 这篇文章主要让大家明白多线程爬虫,...
    99+
    2022-06-07
    爬虫 GO 并发 go语言
  • Go并发中的重定向:如何实现?
    Go语言是一种高效、简洁的编程语言,其在并发编程方面具有很强的优势。在Go语言中,重定向是一种常见的操作,它可以将程序的输出重定向到一个文件或者标准输出流中。本文将介绍Go语言中如何实现重定向操作,并给出一些示例代码。 一、什么是重定向 在...
    99+
    2023-06-01
    重定向 框架 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作