Golang web 开发问题请教

2022-11-02 15:05:47 +08:00
 gaozizhong

有一批带有层级关联的文本文件,文件和文件之间也有依赖关系(其实就是 mib 文件)

需要解析其中的层级关系并存入数据库,现在把每一个 mib 文件的解析打包成了一个事务

当一次性解析多个文件时,速度会很慢,造成前端超时

有没有什么方法可以优化一下啊

2133 次点击
所在节点    Go 编程语言
11 条回复
aladdinding
2022-11-02 15:20:52 +08:00
异步
gaozizhong
2022-11-02 16:43:04 +08:00
@aladdinding 就是并发编程呗?现在把每一个 mib 文件的解析打包成了一个事务,如果按照每个 mib 文件一个并发的话,数据库顶不住啊。我在想怎样实现把结果先返回,然后后台继续解析处理数据。
alexsunxl
2022-11-02 16:57:13 +08:00
他意思是你简单加个任务管理的模块,然后把接口拆开。
execTask
status/:task_id
listTask
alexsunxl
2022-11-02 16:58:41 +08:00
前端触发就 execTask ,但是不管结果,只管开始,开始了就给个 taskid 返回给前端。
这样前端肯定不会超时了。
如果前端需要知道状态,就让前端去带着 id 查 status
wangtian2020
2022-11-02 17:08:43 +08:00
告诉前端,“我”后端已经在做了。他“前端”可以稍后刷新页面查看结果 [进行中] [成功] [失败]
mengdodo
2022-11-03 08:31:17 +08:00
@wangtian2020 交警 12123 就是这么干的,提醒你一天后再来看违章
gaozizhong
2022-11-03 10:05:38 +08:00
@alexsunxl 我也是这样想的,但是触发 execTask 时怎样让程序去后台解析 mib 文件呢? Goroutine 的话是不是有主死从随的问题。想问一下具体的 go 实现方式,想了好久也没想到好的是实现方式
alexsunxl
2022-11-03 10:15:21 +08:00
@gaozizhong 最简单的,一个独立的协程(在 main 里起和 http 服务不相关联)搞个定时器去扫 mysql 的 task 状态呀。拿到了任务就分配个处理任务的协程。协程完成任务,就改一下 mysql 里 task 的状态
alexsunxl
2022-11-03 10:19:35 +08:00
或者方案 2 你找个协程池库,main 里面创建好协程池。
execTask 接口 里把 task 的执行逻辑扔进协程池里,完成了就改 task 状态,把协程归还协程池子。
alexsunxl
2022-11-03 10:19:56 +08:00
异步的场景,要多考虑防止重入的情况。
gaozizhong
2022-11-03 11:13:41 +08:00
@alexsunxl 多谢多谢,我去搞一下,弄完来交作业

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

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

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

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

© 2021 V2EX