golang 在 http.ListenAndServe 之后执行函数
golang execute function after http.ListenAndServe
我通过创建一个简单的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)
之前调用函数,那么我将无法通过浏览器访问服务器路由(例如 - localhost: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 服务器 运行?
感谢您的帮助。
initWatch()
和 http.ListenAndServe("127.0.0.1:8080", nil)
这两个调用都让主 goroutine 永远等待。 initWatch()
正在等待 <-done
语句中的一个值,但从未得到一个值。你应该 运行 initWatch
或 http.ListenAndServe
在另一个 goroutine 中,例如 go initWatch()
。或者从另一个 goroutine 向 done
通道发送一个值。
您可以在单独的 goroutine 中启动 watcher。服务器结束后 - 您向观察者发送退出信号。喜欢:
done := initWatch()
serverErr := http.ListenAndServe("127.0.0.1:8080", nil)
done <- true
接下来稍微修改watcher - return通知停止工作的频道。同时工作的 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
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)
之前调用函数,那么我将无法通过浏览器访问服务器路由(例如 - localhost: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 服务器 运行?
感谢您的帮助。
initWatch()
和 http.ListenAndServe("127.0.0.1:8080", nil)
这两个调用都让主 goroutine 永远等待。 initWatch()
正在等待 <-done
语句中的一个值,但从未得到一个值。你应该 运行 initWatch
或 http.ListenAndServe
在另一个 goroutine 中,例如 go initWatch()
。或者从另一个 goroutine 向 done
通道发送一个值。
您可以在单独的 goroutine 中启动 watcher。服务器结束后 - 您向观察者发送退出信号。喜欢:
done := initWatch()
serverErr := http.ListenAndServe("127.0.0.1:8080", nil)
done <- true
接下来稍微修改watcher - return通知停止工作的频道。同时工作的 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
}