首页 > 其他分享 >go并发模式 扇入扇出

go并发模式 扇入扇出

时间:2024-07-10 13:08:09浏览次数:9  
标签:pirm divisor 扇出 扇入 博主 go

扇入扇出寻找素数:

package main

import (
    "fmt"
    "math/rand"
    "runtime"
    "sync"
    "time"
)

var repeatFn = func(done <-chan interface{}, fn func() interface{}) <-chan interface{} {
    valueStream := make(chan interface{})
    go func() {
        defer close(valueStream)
        for {
            select {
            case <-done:
                return
            case valueStream <- fn():
            }
        }
    }()
    return valueStream
}

var toInt = func(done <-chan interface{}, valueStream <-chan interface{}) <-chan int {
    intStream := make(chan int)
    go func() {
        defer close(intStream)
        for v := range valueStream {
            select {
            case <-done:
                return
            case intStream <- v.(int):
            }
        }
    }()
    return intStream
}

var primeChanArr = func(done <-chan interface{}, intStream <-chan int) <-chan int {
    primeStream := make(chan int)
    go func() {
        defer close(primeStream)
        for num := range intStream {
            num -= 1
            pirm := true
            for divisor := num - 1; divisor > 1; divisor-- {
                if num%divisor == 0 {
                    pirm = false
                    break
                }
            }
            if pirm {
                select {
                case <-done:
                    return
                case primeStream <- num:
                }
            }
        }
    }()
    return primeStream
}

var take = func(done <-chan interface{}, valueStream <-chan int, num int) <-chan int {
    takeStream := make(chan int)
    go func() {
        defer close(takeStream)
        for i := 0; i < num; i++ {
            select {
            case <-done:
                return
            case v := <-valueStream:
                takeStream <- v
            }
        }
    }()
    return takeStream
}

var fanIn = func(done <-chan interface{}, channels ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    faninStream := make(chan int)
    multiplex := func(c <-chan int) {
        defer wg.Done()
        for i := range c {
            select {
            case <-done:
                return
            case faninStream <- i:
            }
        }
    }

    wg.Add(len(channels))
    for _, x := range channels {
        go multiplex(x)
    }

    go func() {
        wg.Wait()
        close(faninStream)
    }()

    return faninStream
}

func main() {
    randNum := func() interface{} { return rand.Intn(50000000) }
    done := make(chan interface{})
    defer close(done)
    start := time.Now()

    randIntSream := toInt(done, repeatFn(done, randNum))
    cpuNumber := runtime.NumCPU()
    fmt.Printf("CPU Number: %d\n", cpuNumber)

    chanArray := make([]<-chan int, cpuNumber)

    fmt.Printf("Primes:\n")

    for i := 0; i < cpuNumber; i++ {
        chanArray[i] = primeChanArr(done, randIntSream)
    }

    for prime := range take(done, fanIn(done, chanArray...), 10) {
        fmt.Printf("%d\n", prime)
    }
    fmt.Printf("耗时:%v\n", time.Since(start))
}

 【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/facetwitter/p/18293861

标签:pirm,divisor,扇出,扇入,博主,go
From: https://www.cnblogs.com/facetwitter/p/18293861

相关文章

  • AI绘画comfyui工作流,商业海报设计、Logo设计,一个comfyui工作流就能搞定!
    前言创新设计工作流:轻松打造LOGO和海报本文涉及的工作流和插件,需要的朋友请扫描免费获取哦—HAPPYNEWYEAR—大家好!今天我要分享的是一个高效且创新的设计工作流,这一工具由国外的网友无私分享,适用于LOGO设计和海报创作。这不仅是对开源精神的致敬,也为我们的设计工......
  • 21、Django-缓存(强缓存和协商缓存)-@cache-page()装饰器
    定义:缓存是一类可以更快的读取数据的介质的统称、也指其它可以加快数据读取的存储方式、一般用来存储临时数据、常用介质的是读取速度很快的内存意义:视图渲染有一定的成本、数据库的频繁查询过高、所以对于低频变动的页面可以考虑使用缓存技术、减少实际渲染的次数、用户拿到相......
  • 20、Django-会话-cookie和session-2
    session是在服务器上开辟一段空间用于保留和服务器交互时的重要数据实现方式:--使用session需要在浏览器客户端启动cookie、且在cookie中存储session--每个客户端都可以在服务器端有一个独立的session--注意:不同的请求者之间不会共享这个数据、与请求者一一对应......
  • 19、Django-会话-cookie和session-1
    会话定义:--从打开浏览器访问一个网站开始到关闭浏览器为止、称之为一次会话--http协议是无状态的、导致会话状态难以保持cookie和session就是为了保持会话的技术cookies:--保存在客户端浏览器上的存储空间--查看cookie:--chrom:开发者工具-》Application-......
  • 18、Django-admin管理后台-Meta类
    1、先执行数据库迁移--pythonmanage.pymakemigrations--pythonmanage.pymigrate2、在cmd终端先创建管理员账户--pythonmanage.pycreatesuperuser3、登录--http://127.0.0.1:8000/admin/  注册自定义的模型类若要自己定义的模型类也能在/admin后台......
  • 17、Django-聚合查询-原生sql语句操作raw()
    聚合查询:整表聚合和分组聚合 1、整表聚合--不带分组的聚合查询是指:将全部数据进行集中统计查询--需要导入:--fromdjango.db.modelsimport*--聚合函数:Sum,Avg,Count,Max,Min--语法:--<model_name>.objects.aggregate(结果变量名=聚合函数('字段名'))......
  • 26、Django内建用户系统
    官方文档:https://docs.djangoproject.com/en/2.2/topics/auth 基本字段模型类位置:--fromdjango.contrib.auth.modelsimportUser   ......
  • 25、Django-生成csv文件
    python提供了内建库-csv、可以直接通过改库操作csv文件案例如下:写入csv文件importcsvwithopen('eggs.csv','w',newline='')ascsvfile:write=csv.writer(csvfile)write.writerow(['a','b','c']) #csv文件下载在网站中......
  • 24、Django-网站分页功能-Pagintor类
    -Django提供了Paginator类可以方便的实现分页功能-Painator类位于django.core.pagintor模块中负责分页数据整体的管理对象的构造方法:paginator=Paginator(object_list,per_page)-参数:-object_list:需要分页的数据的对象列表-数据的个数-......
  • 23、Django-CSRF跨站伪造请求攻击
     配置:1、在settings.py中确认MIDDLEWARE中确保--django.middleware.csrf.CsrfViewMiddleware打开2、在模板中、form标签下添加如下标签:--{%csrf_token%}#这个就是页面中的暗号 案例views.py-------------------------------------------------......