与其他Go流程进行通信

时间:2014-07-31 17:36:58

标签: go inter-process-communicat

我有一个程序从控制台读取文件名并执行go run filename.go

// main.go
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "os/exec"
)

func main() {
    console := bufio.NewReader(os.Stdin)
    fmt.Print("Enter a filename: ")

    input, err := console.ReadString('\n')
    if err != nil {
        log.Fatalln(err)
    }

    input = input[:len(input)-1]

    gorun := exec.Command("go", "run", input)
    result, err := gorun.Output()
    if err != nil {
        log.Println(err)
    }

    fmt.Println("---", input, "Result ---")
    fmt.Println(string(result))
}

在同一目录中,我有另一个这样的文件。

// hello.go
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

当我在控制台中输入“hello.go”时,该文件运行,其输出返回到父Go进程。但是,我有另一个这样的程序。

// count.go
package main

import (
    "fmt"
    "time"
)

func main() {
    i := 0
    for {
        time.Sleep(time.Second)
        i++
        fmt.Println(i)
    }
}

除了,因为这个程序永远不会返回,我的父进程永远都会挂起。有没有办法与不同的Go流程进行通信?我正在考虑像goroutines的渠道,但对于流程。我需要能够从子进程接收实时标准输出。

我正在尝试解决的问题是从目录动态执行Go程序。 Go文件将每天添加,删除和修改。我想尝试像Go Playgrounds这样的东西。主要流程是一个服务于网页的网络服务器,所以我不能一直关闭它来修改代码。

1 个答案:

答案 0 :(得分:1)

不要使用go run,您需要执行go run自己正在做的事情,让go程序成为服务器进程的直接子项。

使用go build -o path_to/binary source_file.go可以为您提供更多控制权。然后,您可以直接执行并与生成的二进制文件进行通信。