Heim > Backend-Entwicklung > Golang > So filtern Sie doppelte Systemnachrichten aus fsnotify

So filtern Sie doppelte Systemnachrichten aus fsnotify

王林
Freigeben: 2024-02-11 10:03:08
nach vorne
572 Leute haben es durchsucht

如何从 fsnotify 过滤重复的系统消息

php小编百草在这里与大家分享一种有效的方法,即如何从fsnotify过滤重复的系统消息。在日常的开发工作中,我们经常会遇到需要实时监控文件系统变化的场景,而fsnotify正是一个强大的工具。然而,当系统频繁变动时,可能会导致大量的重复消息出现,给我们的工作带来困扰。因此,本文将教您一种简单而实用的过滤重复系统消息的方法,帮助您提高工作效率。

问题内容

我使用“github.com/fsnotify/fsnotify”来监听文件更改,但是我应该如何多次过滤某些消息?

func listener() {
    watcher, err := fsnotify.newwatcher()
    if err != nil {
        log.fatal(err)
    }
    defer watcher.close()
    done := make(chan bool)
    go func() {
        for {
            select {
            case event, ok := <-watcher.events:
                if !ok {
                    return
                }
                log.println("event:", event.name, event.op)

                // writing in this way reduces some messages:
                if event.op&fsnotify.rename == fsnotify.rename {
                    // do ...
                } else if event.op&fsnotify.create == fsnotify.create {
                    // do ...
                } else if event.op&fsnotify.write == fsnotify.write {
                    // do ...
                } else if event.op&fsnotify.remove == fsnotify.remove {
                    // do ...
                }
            case _, ok := <-watcher.errors:
                if !ok {
                    return
                }
            }
        }
    }()
    
    err = watcher.add("e:/.../demo")
    if err != nil {
        log.fatal(err)
    }
    <-done
}
Nach dem Login kopieren

比如write、create事件发生了好几次,我发现官方已经修复了bug,但是好像没有完全解决

2022/12/12 21:00:55 event: e:\...\demo\a.bbb create
2022/12/12 21:00:55 event: e:\...\demo\a.bbb create
2022/12/12 21:00:55 event: e:\...\demo\a.bbb create


2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
2022/12/12 21:01:57 event: e:\...\demo\2.md write
Nach dem Login kopieren

我应该如何过滤消息?

##############################

var syncMap sync.Map
go func() {
    for {
        select {
        case event, ok := <-watcher.Events:
            if !ok {
                return
            }
            fPath := strings.ReplaceAll(event.Name, "\\", "/")
            pathKey, _ := syncMap.Load(fPath)
            if pathKey != 1 {
                // ...
                syncMap.Store(fPath, 1)

                go func() {
                    time.Sleep(time.Second * 2)
                    syncMap.Delete(fPath)
                }()
            }
        case _, ok := <-watcher.Errors:
            if !ok {
                return
            }
        }
    }
}()
Nach dem Login kopieren

解决方法

如果发出事件的库不在您的控制之下,您只能更改处理重复项的方式。 您可以使用 map[string]bool 来跟踪您已经看到/处理的事件,因此修改您的代码可以执行以下操作:

seenMap := make(map[string]bool)
go func() {
    for {
        select {
        case event, ok := <-watcher.Events:
            if !ok {
                return
            }
            log.Println("event:", event.Name, event.Op)
            _, seen := seenMap[event.Name]
            if !seen {
                // Writing in this way reduces some messages:
                if event.Op&fsnotify.Rename == fsnotify.Rename {
                    // do ...
                } else if event.Op&fsnotify.Create == fsnotify.Create {
                    // do ...
                } else if event.Op&fsnotify.Write == fsnotify.Write {
                    // do ...
                } else if event.Op&fsnotify.Remove == fsnotify.Remove {
                    // do ...
                }
                seenMap[event.Name] = true
            }
        case _, ok := <-watcher.Errors:
            if !ok {
                return
            }
        }
    }
}()
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo filtern Sie doppelte Systemnachrichten aus fsnotify. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage