关于 Golang 中数据传递的问题,希望各位大佬帮忙解惑

2019-03-09 23:30:27 +08:00
 sunzhenyucn

疑惑阐述

在提出疑惑之前,先阐述一下需求, 目前在将一个摄像头的 SDK ( C++库)适配自己的一个视频流解码服务,这个摄像头的 SDK 是这样的工作原理:
在初始化 Env->调用实时预览接口->注册回调函数的方式来将摄像头的视频码流数据传送给 SDK 使用者。
此处一个 Env 代表一个摄像头设备。
我在使用 CGO 中可以将 Go 函数 export 给 C 代码来调用的 feature 的过程中,在注册回调函数这个阶段里调用我在 Go 中 export 的 Go 函数(函数名为 publishPackage ),将获取到的视频码流数据包装之后放入一个全局的 channel 里(这里的做法似乎不太合适,但由于经验有限,目前只能想到这样的方法),那么在并发的情况下,单独一个全局的 Channel 肯定是满足不了并发的场景的,于是愚钝的我使用了一个全局的 sync.Map 来存放不同 Env 的 Channel,Key 为 Env 的唯一 ID,在 publishPackage 这个函数中,通过 sync.Map.Load 方法拿到当前 Env 所属的 Channel 并将包装好的视频流数据写进 Channel 中。
我又另外提供了一个 RegistryReceiver 的函数,参数为一个 Channel,这个函数中会启动一个 Goroutine 通过 select 来检测当前 Env 所属的 Channel 中是否有视频码流数据,如果有则将视频码流数据写入参数传进来的 Channel 中,提供视频流解码服务来拿到视频码流数据,拿到数据之后再进行接下来的解码操作。
在以上的流程中,目前遇到的问题是在拿到 N 个 Package 之后程序将会无法响应掉,查不出来是哪里的问题(由于只是一个没有认真学习过 Golang 的彩笔)希望各位大佬可以帮忙分析一下。万分感谢!

代码已经托管到 Github,猛点此处

PS:各位大佬如果看了代码之后请轻喷,代码风格有点一言难尽。

2520 次点击
所在节点    Go 编程语言
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/542910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX