Heim  >  Artikel  >  Backend-Entwicklung  >  Schließen Sie die vom Fiber-Endpunkt generierte Goroutine

Schließen Sie die vom Fiber-Endpunkt generierte Goroutine

王林
王林nach vorne
2024-02-05 23:03:041128Durchsuche

关闭由 Fiber 端点生成的 goroutine

Frageninhalt

Ich habe ein Programm, das ffmpeg verwendet, um eine RTSP-Kamera in das HLS-Format zu streamen. Wenn ffmpeg im Hintergrund läuft, erstellen Sie eine Goroutine für jeden RTSP-Link

Der Stream wird mit dem folgenden Code hinzugefügt.

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

}

Führen Sie die Streaming-Funktion des Befehls ffmpeg aus.

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

Mein Ziel ist es, jeden os.exec-Prozess (Befehl ffmpeg) zu stoppen oder zumindest alle Goroutinen unter dem Befehl ffmpeg zu schließen, ohne den Glasfaserserver herunterzufahren.

** Golang-Neuling braucht Hilfe **


Richtige Antwort


Das ist der Arbeitscode:

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

}

Und fang an zu streamen:

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
    }

}

.

Das hat bei mir funktioniert, jetzt finde ich keinen besseren Weg. Wenn jemand einen besseren Weg hat, kommentieren Sie ihn bitte.

Das obige ist der detaillierte Inhalt vonSchließen Sie die vom Fiber-Endpunkt generierte Goroutine. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen