golang练手小项目系列(3)-并发读取文件夹信息

栏目: Go · 发布时间: 5年前

问题描述:

实现一个程序计算并打印输入的目录下所有文件的总数和总大小(以GB计算)。完成之后你将熟悉select、WaitGroup、ioutil的用法。

要点:

并发读取文件(夹)信息。

限制开启的goroutines的最大数量。

运行时每隔500ms打印当前已经统计的文件数和总大小(使用命令行参数指定此功能是否启用)。

拓展:

在执行中在有外部输入时退出程序。

实现:

import (

"flag"

"fmt"

"io/ioutil"

"os"

"path/filepath"

"sync"

"time"

)

var verbose = flag.Bool("v", false, "show verbose progress messages")

var sema = make(chan struct{}, 50)

var done = make(chan struct{})

func dirents(dir string) []os.FileInfo{

select {

case sema <- struct{}{}: //

case <- done:

return nil

}

defer func() {<- sema}()

entries, err := ioutil.ReadDir(dir)

if err != nil{

fmt.Fprintf(os.Stderr, "du1: %v\n", err)

return nil

}

return entries

}

func walkDir(dir string, n *sync.WaitGroup, fileSizes chan<- int64){

defer n.Done()

if cancelled(){

return

}

for _, entry := range dirents(dir){

if entry.IsDir(){

n.Add(1)

subdir := filepath.Join(dir, entry.Name())

go walkDir(subdir, n, fileSizes)

} else {

fileSizes <- entry.Size()

}

}

}

func printDiskUsage(nfiles, nbytes int64){

fmt.Printf("%d files %.1f GB\n", nfiles, float64(nbytes/1e9))

}

func cancelled() bool{

select {

case <- done:

return true

default:

return false

}

}

func main() {

flag.Parse()

roots := flag.Args()

var tick <-chan time.Time

if *verbose{

tick = time.Tick(500 * time.Millisecond)

}

if len(roots) == 0{

roots = []string{"."}

}

fileSizes := make(chan int64)

var nfiles, nbytes int64

var n sync.WaitGroup

for _, root := range roots{

n.Add(1)

go walkDir(root, &n, fileSizes)

}

go func() {

n.Wait()

close(fileSizes)

}()

go func() {

os.Stdin.Read(make([]byte, 1))

close(done)

}()

loop:

for {

select {

case <-done:

for range fileSizes{

//

}

case size, ok := <- fileSizes:

if !ok {

break loop

}

nfiles++

nbytes += size

case <- tick:

printDiskUsage(nfiles, nbytes)

}

}

printDiskUsage(nfiles, nbytes)

}


以上所述就是小编给大家介绍的《golang练手小项目系列(3)-并发读取文件夹信息》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

并行计算导论

并行计算导论

Ananth Grama、George Karypis、张武、毛国勇、Anshul Gupta、Vipin Kumar、程海英 / 张武、毛国勇、程海英 / 机械工业出版社 / 2005-1-1 / 49.00元

《并行计算导论》(原书第2版)全面介绍并行计算的各个方面,包括体系结构、编程范例、算法与应用和标准等,涉及并行计算的新技术,也覆盖了较传统的算法,如排序、搜索、图和动态编程等。《并行计算导论》(原书第2版)尽可能采用与底层平台无关的体系结构并且针对抽象模型来设计处落地。书中选择MPI、POSIX线程和OpenMP作为编程模型,并在不同例子中反映了并行计算的不断变化的应用组合。一起来看看 《并行计算导论》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具