dou70260 2017-10-16 20:29
浏览 420
已采纳

http.ListenAndServe之后的golang执行功能

I am beginning to learn golang by creating a simple http server

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" )
    }
}

The above code will start a local server on 8080 and I am able to hit the routes via browser. It's all good!

However, now I want to run a separate go routine, that watches a file -

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
}

And now, if I call the function initWatch() BEFORE http.ListenAndServe("127.0.0.1:8080", nil) then I am not able to access the server routes via browser(ex - localhost:8080) because the sever has not spawned. Ex -

initWatch()
serverErr := http.ListenAndServe("127.0.0.1:8080", nil) // set listen port

And if I call the function initWatch() AFTER http.ListenAndServe("127.0.0.1:8080", nil) then the file watcher function is not working. Ex -

serverErr := http.ListenAndServe("127.0.0.1:8080", nil) // set listen port
initWatch()

How do I make both the initWatch()(file watcher) and the http server run?

Appreciate your help.

  • 写回答

2条回答 默认 最新

  • donglengli0644 2017-10-17 04:46
    关注

    You may start watcher in separate goroutine. After the server ends - you send signal to exit to the watcher. like:

    done := initWatch()
    serverErr := http.ListenAndServe("127.0.0.1:8080", nil)
    done <- true
    

    Next slightly modify watcher - return channel where to notify to stop working. Also working goroutine listens for exit signal.

    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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来