V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
starvedcat
V2EX  ›  编程

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

  •  
  •   starvedcat · 2018-05-26 07:05:25 +08:00 · 2869 次点击
    这是一个创建于 2367 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有一个后端服务,该服务会在服务器上运行一个脚本来做一些运算,运算结果保存在文件内,文件名形如 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

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

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

    6 条回复    2018-05-27 02:02:46 +08:00
    starvedcat
        1
    starvedcat  
    OP
       2018-05-26 07:08:15 +08:00
    就是说,如何让服务器知道某个脚本运行结束了
    上面的方法 1:“文件不存在->未结束”,“文件存在->已结束”
    上面的方法 2:“文件被加锁->未结束”,“文件可访问->已结束”
    上面的方法 3:“['finished'] == false -> 未结束”,“['finished'] == true -> 已结束”
    kslr
        2
    kslr  
       2018-05-26 07:20:13 +08:00 via Android   ❤️ 1
    打开页面建立 websocket 执行完毕获得数据
    你绕的的太远了
    pimin
        3
    pimin  
       2018-05-26 07:54:34 +08:00 via iPad   ❤️ 1
    应该说都可以达到目的,选一个方案先实现了,无需纠结。如果是我更喜欢对输出做校验,运算结果开始和结束设置 flag,读取之后第一时间判断 flag。
    fuchaofather
        4
    fuchaofather  
       2018-05-26 08:12:19 +08:00 via Android
    @kslr 我觉得这位大佬说的不错
    omph
        5
    omph  
       2018-05-26 08:48:23 +08:00   ❤️ 1
    把脚本输出重定向到后端里,运行完毕,由后端生成文件
    chen1164162915
        6
    chen1164162915  
       2018-05-27 02:02:46 +08:00
    脚本先把文件占用了,前端请求的时候判断下占用状态
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:48 · PVG 06:48 · LAX 14:48 · JFK 17:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.