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