请教这个功能的正确实现方式?

2018-05-26 07:05:25 +08:00
 starvedcat

我现在有一个后端服务,该服务会在服务器上运行一个脚本来做一些运算,运算结果保存在文件内,文件名形如 result_12345,并且通过 url/results/12345 在 web 上显示出来

这个运算可能会耗时很久,所以当运算在进行中时,我设定一个间隔让前端自动刷新

我希望,只有当运算结束时,url/results/12345 才显示数据,否则,就什么也不显示(而不是在运算进行到一半时,就显示出一部分运算结果)

我现在能想到的方案:

  1. 修改脚本,将运算结果先保存在一个 temp 文件内,当运行完毕时,再重命名为 result_12345
  2. 修改脚本,将 result_12345 加锁,使得当运算在进行中时,服务器代码无法访问该文件
  3. 修改后端代码,当后端 call 这个脚本时,设定 result[12345]['finished'] = false,并且启动一个子进程去运行脚本;当脚本运行完毕时再设定 result[12345]['finished'] = true

因为不是严肃用途,所以不需要考虑太多的边缘情况

有没有比较好的实现方法?谢谢

2887 次点击
所在节点    编程
6 条回复
starvedcat
2018-05-26 07:08:15 +08:00
就是说,如何让服务器知道某个脚本运行结束了
上面的方法 1:“文件不存在->未结束”,“文件存在->已结束”
上面的方法 2:“文件被加锁->未结束”,“文件可访问->已结束”
上面的方法 3:“['finished'] == false -> 未结束”,“['finished'] == true -> 已结束”
kslr
2018-05-26 07:20:13 +08:00
打开页面建立 websocket 执行完毕获得数据
你绕的的太远了
pimin
2018-05-26 07:54:34 +08:00
应该说都可以达到目的,选一个方案先实现了,无需纠结。如果是我更喜欢对输出做校验,运算结果开始和结束设置 flag,读取之后第一时间判断 flag。
fuchaofather
2018-05-26 08:12:19 +08:00
@kslr 我觉得这位大佬说的不错
omph
2018-05-26 08:48:23 +08:00
把脚本输出重定向到后端里,运行完毕,由后端生成文件
chen1164162915
2018-05-27 02:02:46 +08:00
脚本先把文件占用了,前端请求的时候判断下占用状态

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

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

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

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

© 2021 V2EX