博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go程序设计语言练习题-第9章(9.4-9.5)
阅读量:6098 次
发布时间:2019-06-20

本文共 2733 字,大约阅读时间需要 9 分钟。

package mainimport (    "fmt"    "runtime"    "time")// 用通道串联goroutine流水线// 实现方式:将goroutine之间通讯所需的chan存入chs,// 创建流水线开始的goroutine,向chs[0]写入0,// 第二个goroutine从chs[0]读出数据并做加一处理,然后写入chs[1]交给流水线中下一个goroutine// ......// 统计程序消耗的内存,在超过1G时终止程序func ex9_4() {    // 获得目前内存使用情况    getMemSys := func() uint64 {        mem := runtime.MemStats{}        runtime.ReadMemStats(&mem)        return mem.Sys    }    before := getMemSys()    chs := []chan int{}    start := make(chan int)    chs = append(chs, start)    go func() {        for {            start <- 0        }    }()    for n := 0; ; n++ {        out := chs[n]        in := make(chan int)        chs = append(chs, in)        go func(n int, in, out chan int) {            for {                num := <-in                out <- num + 1            }        }(n, in, out)        // 获得程序使用内存情况        memAlloc := getMemSys() - before        if memAlloc > 1024*1024*1024 { // 消耗1G内存时终止程序            fmt.Println(n, "Goroutines") // 大概11~12万,每个goroutine消耗内存9k左右            break        }    }}// 通过两个无缓冲的通道实现两个goroutine通信,// 每次通信都将同通信计数加一,1s内大概通信200万次func ex9_5() {    ch1 := make(chan int)    ch2 := make(chan int)    n := 1    defer func() {        fmt.Println(n)    }()    go func() {        ch1 <- n        for {            n = <-ch2            n++            ch1 <- n        }    }()    go func() {        for {            n = <-ch1            n++            ch2 <- n        }    }()    time.Sleep(time.Second)}// 无缓冲通道// 打印1A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Zfunc printNoCache() {    ch1 := make(chan int)    ch2 := make(chan int)    end := make(chan struct{})    go func() {        for i := 0; i < 26; i++ {            ch1 <- i + 1            fmt.Printf("%c", <-ch2)        }        close(ch1)    }()    go func() {        for i := range ch1 {            fmt.Print(i)            ch2 <- int('A') + i - 1        }        close(end)    }()    <-end}// 有缓冲通道// 打印1A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Zfunc printWithCache() {    ch1 := make(chan int, 1)    ch2 := make(chan int, 1)    done := make(chan struct{})    go func() {        for i := 1; i <= 26; i++ {            ch2 <- i            fmt.Printf("%c", <-ch1)        }        close(ch2)    }()    go func() {        for n := range ch2 {            fmt.Print(n)            ch1 <- int('A') + n - 1        }        close(ch1)        close(done)    }()    <-done}func main() {
ex9_4() ex9_5()
printNoCache()     printWithCache() }

执行效果:

117415 Goroutines25081931A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Z1A2B3C4D5E6F7G8H9I10J11K12L13M14N15O16P17Q18R19S20T21U22V23W24X25Y26Z成功: 进程退出代码 0.

 

转载于:https://www.cnblogs.com/ling-diary/p/10516799.html

你可能感兴趣的文章
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
淘宝的几个架构图
查看>>
Android扩展 - 拍照篇(Camera)
查看>>
JAVA数组的定义及用法
查看>>
充分利用HTML标签元素 – 简单的xtyle前端框架
查看>>
设计模式(十一):FACADE外观模式 -- 结构型模式
查看>>
iOS xcodebuile 自动编译打包ipa
查看>>
程序员眼中的 SQL Server-执行计划教会我如何创建索引?
查看>>
【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
查看>>
cmake总结
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
coco2d-x 基于视口的地图设计
查看>>
C++文件读写详解(ofstream,ifstream,fstream)
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>