我通过创建一个简单的http服务器开始学习golang
func main() {
f, err := os.OpenFile("testlogfile", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0666)
if err != nil {
fmt.Println("error opening file: %v", err)
}
defer f.Close()
log.SetOutput(f)
http.HandleFunc("/", defaultHandler)
http.HandleFunc("/check", checkHandler)
serverErr := http.ListenAndServe("127.0.0.1:8080", nil) // set listen port
if serverErr != nil {
log.Println("Error starting server")
} else {
fmt.Println("Started server on - 127.0.0.1:8080" )
}
}
上面的代码将在 8080 上启动一个本地服务器,我可以通过浏览器访问路由。一切都很好!
但是,现在我想运行一个单独的 go 例程,它会监视一个文件 -
func initWatch() string{
watcher, err := fsnotify.NewWatcher()
if err != nil {
fmt.Println(err)
}
defer watcher.Close()
done := make(chan bool)
go func() {
for {
select {
case event := <-watcher.Events:
if ( event.Op&fsnotify.Remove == fsnotify.Remove || event.Op&fsnotify.Rename == fsnotify.Rename ) {
fmt.Println("file removed - ", event.Name)
}
case err := <-watcher.Errors:
fmt.Println("error:", err)
}
}
}()
err = watcher.Add("sampledata.txt")
if err != nil {
fmt.Println(err)
}
<-done
}
现在,如果我调用函数 initWatch()
BEFORE http.ListenAndServe("127.0.0.1:8080", nil)
然后我无法通过浏览器访问服务器路由(例如 - 本地主机:8080),因为服务器尚未生成。
例如-
initWatch()
serverErr := http.ListenAndServe("127.0.0.1:8080", nil) // set listen port
如果我调用函数 initWatch()
AFTER http.ListenAndServe("127.0.0.1:8080", nil)
然后文件观察器功能不工作。
例如-
serverErr := http.ListenAndServe("127.0.0.1:8080", nil) // set listen port
initWatch()
如何同时运行 initWatch()
(文件观察器)和 http 服务器?
感谢您的帮助。
最佳答案
您可以在单独的 goroutine 中启动 watcher。服务器结束后 - 您向观察者发送退出信号。喜欢:
done := initWatch()
serverErr := http.ListenAndServe("127.0.0.1:8080", nil)
done <- true
接下来稍微修改 watcher - 返回通知停止工作的 channel 。同时工作的 goroutine 监听退出信号。
func initWatch() chan bool {
watcher, err := fsnotify.NewWatcher()
if err != nil {
fmt.Println(err)
}
defer watcher.Close()
done := make(chan bool)
go func() {
for {
select {
case event := <-watcher.Events:
if ( event.Op&fsnotify.Remove == fsnotify.Remove || event.Op&fsnotify.Rename == fsnotify.Rename ) {
fmt.Println("file removed - ", event.Name)
}
case err := <-watcher.Errors:
fmt.Println("error:", err)
// listen exit signal
case <- done:
break
}
}
}()
err = watcher.Add("sampledata.txt")
if err != nil {
fmt.Println(err)
}
return done
}
关于http - golang 在 http.ListenAndServe 之后执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46778600/