go - Golang 终止长时间运行的 CGO 函数
问题描述
背景
大家好,我正在研究一个读取文档文件内部然后根据其内容进一步处理它的工作人员。工作人员是用 编写的go
,但是读取文档内容的代码是从供应商处采购并编写的C
。
我们当前与C
库的集成正在使用CGO
,因此我们可以直接调用函数等。
问题
当我们收到一个大文件时,读取文档内容的过程可能需要很长时间。如果这种情况同时发生在所有工作人员身上,那么它将阻止任何其他文件被处理。为了缓解这种情况,我们已经对每个客户实施了速率限制,但是,这个问题仍然会影响来自同一家公司的不同用户。
触发单客户限速时,同一公司的用户只能在上一个请求完成后才能处理他们的文件,但是,如果工作人员正在处理一个大文件,则可能需要数十分钟才能完成,这将阻止其他用户的文件被处理。
为了解决这个问题,我们希望为工作人员正在处理的每个文件实现超时。因此,如果处理时间超过阈值,我们可以终止进程,返回错误并继续处理下一个文件。
想法
让我列出一些我们必须实现的想法和挑战:
使用 goroutine
我们可以在 goroutine 上运行 IO 阻塞操作,并在超时后取消它。但是,由于代码将在 go 例程中运行,因此我们无法在超时后终止它。这将使 go 例程中的操作保持运行,尽管我们不再需要结果。
通过使用子进程
os.StartProcess
这样,我们可以预分叉二进制文件并使用它,直到我们遇到超时,我们需要杀死它。然后,我们将创建一个新流程,冲洗并重复。但是,这会增加很多复杂性,因为我们需要将
C
代码分离到一个新的二进制文件中,并且进程间通信将通过管道完成,这将导致很多冗长,因为我们需要以文本方式进行通信并完成所有读取操作和等待。我试图把它作为最后的手段。
问题
基本上,我想询问其他可以解决我的问题的解决方案。如果您有任何想法,请告诉我。谢谢!
解决方案
推荐阅读
- angular - 为什么我在使用 Angular 发布 url 时出现错误
- reactjs - redux-thunk:如何触发动作?
- google-chrome - 嵌入在 iframe 中的 Auth0 在 Chrome 上不起作用,但在 Firefox 上有效(可能的 cookie 问题?)
- google-cloud-platform - 在 Google Cloud Platform (GCP) 上自动部署 F5 BIG-IP
- audio - FFMPEG - 在流 #0 中找不到编解码器 pcm_s16le 的标记,容器中当前不支持编解码器
- r - 是否有一个 purrr-shortcut 来解决列表参数而不是它的元素?
- javascript - 单击数据表记录时仅显示第一条记录
- html - VBA打开网页然后提交数据
- javascript - 如何使用 webpack5 模块联合从另一个具有微前端架构的应用程序导入组件?
- spark-streaming - 我可以将 Redis Streams 作为 SuperSet 的主要数据源吗?