【原创】一个go语言小项目实例:通过select监控channel并阻塞

[复制链接]
2485|4
 楼主 | 2019-1-17 09:59 | 显示全部楼层 |阅读模式
本帖最后由 keer_zu 于 2019-1-17 15:13 编辑

(利用这个简单小原理实现的一个小项目,监控最新创建的,拥有多级深度的文件夹变化内容,并将最新产生的文件通过tcp或者http发送给连上来的tcp客户端和http服务端:
这个小项目源码




这是一个简单的例子:


  1. package main

  2. import (
  3. "fmt"
  4. "time"
  5. )

  6. func generateString(strings chan string) {
  7.     time.Sleep(3*time.Second)
  8.     strings <- "Monday"
  9.     time.Sleep(5*time.Second)
  10.     strings <- "Tuesday"
  11.     time.Sleep(3*time.Second)
  12.     strings <- "Wednesday"
  13.     time.Sleep(5*time.Second)
  14.     strings <- "Thursday"
  15.     strings <- "Friday"
  16.     strings <- "Saturday"
  17.     strings <- "Sunday"
  18.     close(strings)
  19. }


  20. func monitor(cancel chan string) {

  21.     var stop bool = false
  22.         for {
  23.             time.Sleep(1*time.Second)
  24.             fmt.Println("i am alive!")
  25.             select {
  26.                 case can := <- cancel:
  27.                     if can == "cancel" {
  28.                         fmt.Println("break!")
  29.                         stop = true
  30.                         break
  31.                     }
  32.                     
  33.             }

  34.             if stop {
  35.                 break
  36.             }
  37.         }


  38.     fmt.Println("good bye!")
  39. }

  40. func main() {
  41.     //strings := make(chan string) // 无缓冲channel
  42.     cancel_sig := make(chan string)

  43.     //go generateString(strings)

  44.     //for s := range strings {
  45.     //    fmt.Println(s)
  46.     //}

  47.     go monitor(cancel_sig)

  48.     time.Sleep(10*time.Second)

  49.     cancel_sig <- "cancel"

  50.     for {
  51.         time.Sleep(5*time.Second)
  52.         fmt.Println("go away!")
  53.         break
  54.     }
  55. }
复制代码



如果有多个channel,也可以被一个select监听,例如:


  1. package notify;

  2. import (
  3.     "github.com/fsnotify/fsnotify"
  4.     "github.com/smtp-http/filemonitor_macmini/conn"
  5.     "github.com/smtp-http/filemonitor_macmini/config"
  6.     "log"
  7.     "fmt"
  8.     "path/filepath"
  9.     "path"
  10.     "io/ioutil"
  11.     "sync"
  12. )

  13. type FileMonitor struct {
  14.     m_tcpserver *conn.TcpServer
  15. }

  16. var instance *FileMonitor
  17. var once sync.Once

  18. func GetFileMonitorInstance() *FileMonitor {
  19.     once.Do(func() {
  20.         instance = &FileMonitor{}
  21.     })
  22.     return instance
  23. }

  24. func (f *FileMonitor)SetTcpserver(server *conn.TcpServer) {
  25.     f.m_tcpserver = server
  26. }

  27. func (f *FileMonitor)Monitor(cancel chan string) {

  28.     var stop bool = false

  29.     //创建一个监控对象
  30.     watch, err := fsnotify.NewWatcher();
  31.     if err != nil {
  32.         log.Fatal(err);
  33.     }
  34.     defer watch.Close();
  35.     //
  36.     err = watch.Add(config.GetConfig().Path);
  37.     if err != nil {
  38.         log.Fatal(err);
  39.     }
  40.     //我们另启一个goroutine来处理监控对象的事件

  41.     for {
  42.         fmt.Println("--- 1")
  43.         if stop {
  44.             break
  45.         }
  46.         select {
  47.             case ev := <-watch.Events:
  48.                 {
  49.                     //判断事件发生的类型,如下5种
  50.                     // Create 创建
  51.                     // Write 写入
  52.                     // Remove 删除
  53.                     // Rename 重命名
  54.                     // Chmod 修改权限
  55.                     if ev.Op&fsnotify.Create == fsnotify.Create {
  56.                         fmt.Println("创建文件 : ", ev.Name);
  57.                     }
  58.                     if ev.Op&fsnotify.Write == fsnotify.Write {
  59.                         fmt.Println("写入文件 : ", ev.Name);
  60.                         paths, fileName := filepath.Split(ev.Name)
  61.                         fmt.Println(paths, fileName) //获取路径中的目录及文件名 E:\data\ test.txt
  62.                         fmt.Println(filepath.Base(ev.Name)) //获取路径中的文件名test.txt
  63.                         

  64.                         if path.Ext(ev.Name) == config.GetConfig().FileExtension {
  65.                             fmt.Println(path.Ext(ev.Name)) //获取路径中的文件的后缀 .txt
  66.                             b, err := ioutil.ReadFile(ev.Name)
  67.                             if err != nil {
  68.                                 fmt.Print(err)
  69.                             }
  70.                             fmt.Println(b)
  71.                             //str := string(b)
  72.                         
  73.                             f.m_tcpserver.Notify(b)
  74.                             configure := config.GetConfig()
  75.                             if configure.HttpEnable == true {
  76.                                 httpClient := conn.GetHttpClientInstance()
  77.                                 httpClient.HttpPost(b)
  78.                             }

  79.                         }

  80.                         
  81.                     }

  82.                     if ev.Op&fsnotify.Remove == fsnotify.Remove {
  83.                         fmt.Println("删除文件 : ", ev.Name);
  84.                     }

  85.                     if ev.Op&fsnotify.Rename == fsnotify.Rename {
  86.                         fmt.Println("重命名文件 : ", ev.Name);
  87.                     }
  88.                     
  89.                     if ev.Op&fsnotify.Chmod == fsnotify.Chmod {
  90.                         fmt.Println("修改权限 : ", ev.Name);
  91.                     }
  92.                 }

  93.             case can := <- cancel:
  94.                 if can == "cancel" {
  95.                     fmt.Println("break!")
  96.                     stop = true
  97.                     break
  98.                 }
  99.             case err := <-watch.Errors:
  100.                 {
  101.                     log.Println("error : ", err);
  102.                     return;
  103.                 }
  104.         }
  105.     }

  106.     fmt.Println("good bye!")
  107. }
复制代码









 楼主 | 2019-1-17 11:19 | 显示全部楼层
github代码持续更新中。。。。。


代码参考:monitor.go

| 2019-1-18 10:07 | 显示全部楼层
strings是一个标准包名.尽量避免使用
 楼主 | 2019-1-18 13:28 | 显示全部楼层
icecut 发表于 2019-1-18 10:07
strings是一个标准包名.尽量避免使用

| 2019-1-19 14:02 | 显示全部楼层
666
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /3 下一条

快速回复 返回顶部 返回列表