首頁  >  文章  >  後端開發  >  關閉由 Fiber 端點產生的 goroutine

關閉由 Fiber 端點產生的 goroutine

王林
王林轉載
2024-02-05 23:03:041125瀏覽

关闭由 Fiber 端点生成的 goroutine

問題內容

我有一個程序,它是使用 ffmpeg 進行串流傳輸的 rtsp 相機到 hls 格式。 當 ffmpeg 在背景運行時,為每個 rtsp 連結建立 goroutine

流是透過以下程式碼新增的。

func streamprocess(data <-chan streamdata, ctx context.context) {
for v := range data {
    ctx, _ := context.withcancel(ctx)
    go func() {
        if !getstreams(v.camera_id) {
            var stream streamstate
            stream.camera_id = v.camera_id
            stream.state = true
            go stream(v, ctx)
            wg.wait()
        } else {
            return
        }
    }()
}

}

執行 ffmpeg 指令的流函數。

func Stream(meta StreamData, ctx context.Context) error {
    log.Println("Started Streaming")
    ffmpegCmd := exec.Command("ffmpeg", "-i", meta.rtsp, "-pix_fmt", "yuv420p", "-c:v", "libx264", "-preset", "ultrafast", "-b:v", "600k", "-c:a", "aac", "-b:a", "160k", "-f", "rtsp", fmt.Sprintf("rtsp://localhost:8554/%s", meta.camera_id))
    output, _ := ffmpegCmd.CombinedOutput()

    log.Println(string(output))

    for {
        select {
        case <-ctx.Done():
           log.Println("killing process")
           ffmpegCmd.Process.Kill()
           return nil
        }
    }}

我的目標是停止每個 os.exec 進程(ffmpeg 命令)或至少關閉 ffmpeg 命令下的所有 goroutine,而不關閉 fiber 伺服器。

** golang 新手需要幫助 **


正確答案


#這是工作程式碼:

func streamprocess(data <-chan streamdata, ctx context.context) {
ctx, cancel := context.withcancel(ctx)
defer cancel()
for {
    select {
    case v, ok := <-data:
        if ok {
            go func() {
                if !getstreams(v.camera_id) {
                    var stream streamstate
                    stream.camera_id = v.camera_id
                    stream.state = true
                    go stream(v, ctx)
                }
            }()
        } else if !ok {
            cancel()
            return
        }
    case <-ctx.done():
        log.println("closed ctx")
        cancel()
    }

}

並開始串流:

func Stream(meta StreamData, ctx context.Context) error {
log.Println("Started Streaming")
err := exec.CommandContext(ctx, "ffmpeg", "-i", meta.rtsp, "-pix_fmt", "yuv420p", "-c:v", "libx264", "-preset", "ultrafast", "-b:v", "600k", "-c:a", "aac", "-b:a", "160k", "-f", "rtsp", fmt.Sprintf("rtsp://localhost:8554/%s", meta.camera_id)).Run()

if err != nil {
    log.Println("error in streaming", err)
    return err
}

log.Println(string("waiting for closure"))
for {
    select {
    case <-ctx.Done():
        log.Println("killing process")          
        return nil
    case <-time.After(2* time.second):
        log.Println("started default context")
        return nil
    }

}

.

這對我有用,現在我沒有找到更好的方法。如果有人有更好的方法請評論。

以上是關閉由 Fiber 端點產生的 goroutine的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除