统计1-8000之间的素数。

整体框架:

说明:有五个协程,三个管道。其中一个协程用于写入数字到intChan管道中,另外四个用于取出intChan管道中的数字并判断是否是素数,然后将素数写入到primeChan管道中,最后如果后面四个协程哪一个工作完了,就写入一个true到exit管道中,最后利用循环判断这四个协程是否都完成任务,并退出。

main.go

package main

import (
"fmt"
"go_code/project_13/test"
"time"
) func putNum(intChan chan int) {
for i := ; i <= ; i++ {
intChan <- i
}
close(intChan)
} func isPrime(n int) bool {
//这里本来i只需要到int(math.Sqrt(float64(n))),为了计算时间,就直接设置i-n了
for i := ; i <= n; i++ {
if n%i == {
return false
}
}
return true
} func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
for {
// time.Sleep(time.Millisecond * 10)
num, ok := <-intChan
if !ok {
break
}
isp := isPrime(num)
if !isp {
continue
} else {
primeChan <- num
}
}
fmt.Println("有一个协程取不到数据而退出了")
exitChan <- true
} func main() {
intChan := make(chan int, )
primeChan := make(chan int, )
exitChan := make(chan bool, )
//记录当前时间
start := time.Now()
//开启一个协程
go putNum(intChan)
//开启四个协程
for i := ; i < ; i++ {
go primeNum(intChan, primeChan, exitChan)
}
//当四个协程都完成任务后,计算消耗时间,并关闭primeChan管道
go func() {
for i := ; i < ; i++ {
<-exitChan
}
cost := time.Since(start)
fmt.Printf("使用协程耗费时间:%s\n", cost)
close(primeChan)
}() for {
// res, ok := <-primeChan
_, ok := <-primeChan
if !ok {
break
}
//在这里计算已经完成了,为了计算时间,注释掉了打印的操作
// fmt.Printf("素数=%d\n", res)
}
fmt.Println("主线程退出")
test.Test()
}

test.go

package test

import (
"fmt"
"time"
) func isPrime(n int) bool {
for i := ; i <= n; i++ {
if n%i == {
return false
}
}
return true
}
func Test() {
start := time.Now()
for i := ; i < ; i++ {
isPrime(i)
}
cost := time.Since(start)
fmt.Printf("传统方法消耗时间为:%s", cost)
}

最后运行一下看看结果。

使用协程的方法的确是要比使用传统的方法要快的,有其是在数据量进一步的增大时。至此,一个管道和协程的实例就算完成了,

(四十四)golang--协程(goroutine)和管道(channel)相结合实例的更多相关文章

  1. 面试必问:Golang高阶-Golang协程实现原理

    引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发) 进程和线程的区别 进程是计 ...

  2. Golang 协程调度

    一.线程模型 N:1模型,N个用户空间线程在1个内核空间线程上运行.优势是上下文切换非常快但是无法利用多核系统的优点. 1:1模型,1个内核空间线程运行一个用户空间线程.这种充分利用了多核系统的优势但 ...

  3. Golang协程与通道整理

    协程goroutine        不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换.Go在底层进行协助实现      涉及系统调用的地方由Go标准库协助释放CPU      总之,不通 ...

  4. golang协程同步的几种方法

    目录 golang协程同步的几种方法 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup golang协程同步的几种方法 本文简要介绍下go中协程的几 ...

  5. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  6. Golang协程实现流量统计系统(3)

    进程.线程.协程 - 进程:太重 - 线程:上下文切换开销太大 - 协程:轻量级的线程,简洁的并发模式 Golang协程:goroutine Hello world package main impo ...

  7. NeHe OpenGL教程 第四十四课:3D光晕

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. 网站开发进阶(四十四)input type="submit" 和"button"的区别

    网站开发进阶(四十四)input type="submit" 和"button"的区别   在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...

  9. Gradle 1.12用户指南翻译——第四十四章. 分发插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

随机推荐

  1. ElasticSearch - ElasticSearch和kinaba的简单使用

    ElasticSearch和kinaba的简单使用 ElasticSeatch 文档推荐 ElasticSearch 下载 (端口 9200) 安装好es,可以访问 http://localhost: ...

  2. OptimalSolution(7)--大数据和空间限制

    一.布隆过滤器 问题:不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B.现在想要实现一种网页过滤系统,可以根据网页的URL判断该网页是否在黑名单上,如何设计该系统. 要求:允 ...

  3. 判断是否存在UI被触摸

    ) || (Input.touchCount > && Input.GetTouch().phase == TouchPhase.Began)) { #if UNITY_ANDR ...

  4. GCC常用参数详解

    转载:http://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 ...

  5. ArangoDB图数据库--总参

    参考文章: ArangoDB原生多模型数据库(百科) ArangoDB官网 ArangoDB数据库入门 arangodb-vs-cassandra arangodb-vs-mongodb2 Arang ...

  6. ansible之roles

    基于之前的博客介绍,我们已经了解了 tasks 和 handlers,那怎样组织 playbook 才是最好的方式呢?简单的回答就是:使用 roles ! Roles 基于一个已知的文件结构,去自动的 ...

  7. linux centos ubutun svn搭建

    1.卸载SVN 查看自己是否安装了svn svn 上图显示已安装,可用以下命令进行卸载 sudo apt-get remove --purge subversion (–purge 选项表示彻底删除改 ...

  8. <script>属性async和defer的区别

    async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部脚本文件有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只 ...

  9. QHDYZ模拟赛20191027 提前透题

    你们想的美 我给你们透一下题目名称 别刷博客了快去做题

  10. [考试反思]0914csp-s模拟测试43:破绽

    T1会正解.爆int了,代码里一大堆long long但是有一个地方落了.-70分. 离考试结束还有19秒的时候发现手模样例爆负数了,没来得及改. T2没想.打暴力了.然而实际很好想...早读5分钟就 ...