go语言实现回调函数 go函数返回接口( 二 )


具体代码
作为网关,中间件必不可少 , 这类包括请求响应的模式,一般称作洋葱模式 , 每一层都是中间件,一层层进去,然后一层层出来 。
中间件的实现一般有两种,一种是使用数组,然后配合 index 计数;一种是链式调用 。
具体代码
深入理解golang最近三年,在工作中使用go开发了不少服务 。深感go的便捷,以及它的runtime的复杂 。我觉得需要定期的进行总结,因此决定写这篇文章,也许更准确的,应该叫笔记 。
最近终于解决了一个和cgo有关的问题 。这个问题从发现到解决前后经历了接近4个月,当然,和人手不足也有关系 。而对于我个人而言 , 这个问题其实历时2年!这得从头说起 。
在上一家公司的一个项目里,有一个服务做音视频数据的提取,这个服务运行在嵌入式设备TX2上 。音视频提取这一关键功能主要利用nvidia基于gstreamer开发的插件,这个插件可以发挥nvidia gpu的硬件解码功能 。当时这个服务使用go和c混编的方式,问题的症状是服务运行一段时间后,不输出音视频数据 。遗憾的是,由于疫情 , 项目停止,因此没有机会继续研究这个问题 。
时间来到去年底 。当前这个项目进行压力测试,发现关键的语音处理服务运行一段时间后,会出现不拉流的情况,因此也没有后续的结果输出 。症状和上一个项目非常像 。虽然使用的第三方SDK不一样,但同样用了go和c混编的方式 。一开始,焦点就放在go的运行时上,觉得可能是go和c相互调用的方式不对 。经过合理猜测 , 并用测试进行验证后,发现问题还是在第三方拉流的SDK上,它们的回调函数必须要快,否则有可能会阻塞它们的回调线程 。当然,在go调用c的时候,如果耗时比较长,会对go的运行时造成一些副作用;在c回调go的时候,go的运行时也有可能阻塞c的回调线程 。但go的运行时已经比较成熟,因此我觉得它对这个问题的贡献不大 。以上采用了假设-验证的方法,主要的原因还是第三方的拉流SDK不开源 。在定位问题的过程中 , 使用了gdb的gcore来生成堆栈;也搭建了灰度环境来进行压力测试,以及完善监控,这些都是解决方法的一部分 。
正是这一问题,促使我更多的了解go的运行时 。而我看得越多,越觉得go的运行时是一个庞大的怪物 。因此,抱着能了解一点是一点的心态,不断的完善这篇笔记 。
【go语言实现回调函数 go函数返回接口】go语言实现回调函数的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于go函数返回接口、go语言实现回调函数的信息别忘了在本站进行查找喔 。

推荐阅读