为了账号安全,请及时绑定邮箱和手机立即绑定

如何在golang中收听fifo等待fifo文件的输出

如何在golang中收听fifo等待fifo文件的输出

Go
繁星淼淼 2022-10-10 19:40:15
我将运行一个将输出推送到文件系统中的 FIFO 文件的命令。在 bash 中,我可以写timeout 3000 cat server_fifo>server.url等到 fifo 被推送一个输出,或者它达到 3000 超时。我想知道我们如何在 golang 中做到这一点,即一直等待 fifo 文件的输出,并为此等待设置超时。根据 matishsiao 的 gist 脚本,我知道我们可以做到    file, err := os.OpenFile(urlFileName, os.O_CREATE, os.ModeNamedPipe)    if err != nil {        log.Fatal("Open named pipe file error:", err)    }    reader := bufio.NewReader(file)    for {        _, err := reader.ReadBytes('\n')        if err == nil {            fmt.Println("cockroach server started")            break        }    }但是在这种情况下,如何在 for 循环中添加超时?
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

这是您可以使用的简单样板:


finished := make(chan bool)

go func() {

    /*

     * Place your code here

     */

    finished <- true

}()

select {

case <-time.After(timeout):

    fmt.Println("Timed out")

case <-finished:

    fmt.Println("Successfully executed")

}

分配time.Second*3或任何Duration变量timeout。


编辑:添加带有回调的示例函数:


func timeoutMyFunc(timeout time.Duration, myFunc func()) bool {

    finished := make(chan bool)

    go func() {

        myFunc()

        finished <- true

    }()

    select {

    case <-time.After(timeout):

        return false

    case <-finished:

        return true

    }

}


func main() {

    success := timeoutMyFunc(3*time.Second, func() {

        /*

         * Place your code here

         */

    })

}这是您可以使用的简单样板:


finished := make(chan bool)

go func() {

    /*

     * Place your code here

     */

    finished <- true

}()

select {

case <-time.After(timeout):

    fmt.Println("Timed out")

case <-finished:

    fmt.Println("Successfully executed")

}

分配time.Second*3或任何Duration变量timeout。


编辑:添加带有回调的示例函数:


func timeoutMyFunc(timeout time.Duration, myFunc func()) bool {

    finished := make(chan bool)

    go func() {

        myFunc()

        finished <- true

    }()

    select {

    case <-time.After(timeout):

        return false

    case <-finished:

        return true

    }

}


func main() {

    success := timeoutMyFunc(3*time.Second, func() {

        /*

         * Place your code here

         */

    })

}


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信