关闭由 Fiber 端点生成的 goroutine
短信预约 -IT技能 免费直播动态提醒
问题内容
我有一个程序,它是使用 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
关闭由 Fiber 端点生成的 goroutine
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
关闭由 Fiber 端点生成的 goroutine
问题内容我有一个程序,它是使用 ffmpeg 进行流式传输的 rtsp 相机到 hls 格式。当 ffmpeg 在后台运行时,为每个 rtsp 链接创建 goroutine流是通过以下代码添加的。func streamprocess
2024-02-06
当所有工作完成后,如何关闭由多个 goroutine 填充的通道?
当所有工作完成后,如何关闭由多个goroutine填充的通道是一个经常被提及的问题。在Go语言中,关闭一个通道是一种通知接收方没有更多数据的方式。通过关闭通道,接收方可以及时得知发送方已经完成了所有的发送操作。在多个goroutine填充的
2024-02-10