文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

关闭由 Fiber 端点生成的 goroutine

2024-02-06 05:44

关注

问题内容

我有一个程序,它是使用 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的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯