文档章节

golang 多线程查找文件内容

m
 modprobe
发布于 2016/11/08 09:57
字数 271
阅读 12
收藏 0
点赞 0
评论 0
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "io/ioutil"
 6     "os"
 7     "path/filepath"
 8     "strings"
 9 )
10 
11 var matchCount = 0
12 var ch = make(chan int, 512)
13 
14 func findFile(path string, text string) {
15     var pathArray [100]string
16     var count = 0
17     filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
18         if err != nil {
19         }
20         //find text
21         if !info.IsDir() {
22             if info.Size() < 1024*1024 {
23                 pathArray[count] = path
24                 count++
25                 if count >= 100 {
26                     count = 0
27                     go findText(pathArray[0:100], text)
28                     <-ch
29                 }
30             }
31         }
32         return nil
33     })
34     go findText(pathArray[0:count], text)
35     <-ch
36 
37     fmt.Printf("一共发现了 %d 个匹配的文件", matchCount)
38 
39 }
40 
41 func findText(paths []string, text string) {
42     for _, path := range paths {
43         fi, err := os.Open(path)
44         if err != nil {
45             panic(err)
46         }
47         defer fi.Close()
48         fd, err := ioutil.ReadAll(fi)
49         if err != nil {
50             panic(err)
51         }
52 
53         if strings.Index(string(fd), text) > -1 {
54             matchCount++
55             fmt.Println(path)
56         }
57     }
58     ch <- 1
59 }
60 
61 func main() {
62     args := os.Args
63     if len(args) < 3 {
64         fmt.Println("需要两个参数 path text")
65         return
66     }
67     path := args[1]
68     text := args[2]
69 
70     _, err := os.Stat(path)
71 
72     if err != nil {
73         fmt.Println("path不存在")
74     } else {
75         findFile(path, text)
76     }
77 }

 计数器增加的时候应该加锁

© 著作权归作者所有

共有 人打赏支持
m
粉丝 1
博文 35
码字总数 0
作品 0
Golang学习笔记目录

Golang 介绍 Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。...

ChainZhang ⋅ 2017/12/26 ⋅ 0

golang 中的包管理

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: golang 中的包管理 对于习惯了 Java 和 Python 的程序员来说,对于包的管理都有着比较大的期望,当然,虽然 Java 和 Python...

yetship ⋅ 2017/11/06 ⋅ 0

PHP的异步并行扩展Swoole发布1.7版本

Swoole 1.7.0 发布了,该版本主要改进内容包括: reactor线程与writer线程合并 对send优化,加入out_buffer机制 增加AIO异步读写文件的API 增加DNS异步查询函数 swooleclient在php-fpm或apa...

matyhtf ⋅ 2014/04/17 ⋅ 39

golang VS php 性能对比

原文 http://www.isno.cn/2013/12/golang-vs-php/ 在工作的项目中,我的主要开发语言是php,因需求或者为弥补php的缺陷,需要为php做各种各样的扩展,比如php本身不支持线程,没有队列,进程也...

神仙 ⋅ 2013/12/19 ⋅ 33

Golang 学习笔记(06)—— 多线程

本文为转载,原文:Golang 学习笔记(06)—— 多线程 Golang 介绍 线程是cpu调度的最小单位,只有不同的线程才能同时在多核cpu上同时运行。但线程太占资源,线程调度开销大。go中的gorouti...

ChainZhang ⋅ 2017/12/26 ⋅ 0

golang开发环境之vim配置

经过几个小时的翻墙配置,终于配置好了golang的开发环境,截图如下: 功能: 1.代码补全 2.自动保存格式化 3.定义跳转 4.快捷运行 5.tag列表 6.工程文件列表 7.引用查找 ... 由于golang的deb...

Xsank ⋅ 2015/07/11 ⋅ 4

年终盘点!2017年超有价值的Golang文章

年终盘点!2017年超有价值的Golang文章 鸟窝2017-12-281 阅读 Go 马上就要进入2018年了,作为年终的盘点,本文列出了一些2017年的关于Go编程的一些文章,并加上简短的介绍。 文章排名部分先后...

鸟窝 ⋅ 2017/12/28 ⋅ 0

Stackful 协程库--libgo

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库。 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方...

Li_Mr ⋅ 2016/01/25 ⋅ 6

Go笔记2.2 这儿有包了解一下

1 前言 先生,Go语言里有个包,进来了解一下吧。 包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。 如同其它一些编程语言...

iotisan ⋅ 03/23 ⋅ 0

Golang实现简单tcp服务器01 -- 概述

概述 Golang作为一门近些年来非常风光的开发语言, 其实用范围很广, 图形界面, web框架, 图像引擎等等. 由于其语言特性简化了并发/多核的开发, 受到了很大的关注. 而使用它进行服务器开发, 也...

victoriest ⋅ 2015/06/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部