请教这个功能的正确实现方式? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
starvedcat

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

  •  
  •   starvedcat 2018 年 5 月 26 日 3233 次点击
    这是一个创建于 2890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有一个后端服务,该服务会在服务器上运行一个脚本来做一些运算,运算结果保存在文件内,文件名形如 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 年 5 月 26 日
    就是说,如何让服务器知道某个脚本运行结束了
    上面的方法 1:“文件不存在->未结束”,“文件存在->已结束”
    上面的方法 2:“文件被加锁->未结束”,“文件可访问->已结束”
    上面的方法 3:“['finished'] == false -> 未结束”,“['finished'] == true -> 已结束”
    kslr
        2
    kslr  
       2018 年 5 月 26 日 via Android   1
    打开页面建立 websocket 执行完毕获得数据
    你绕的的太远了
    pimin
        3
    pimin  
       2018 年 5 月 26 日 via iPad   1
    应该说都可以达到目的,选一个方案先实现了,无需纠结。如果是我更喜欢对输出做校验,运算结果开始和结束设置 flag,读取之后第一时间判断 flag。
    fuchaofather
        4
    fuchaofather  
       2018 年 5 月 26 日 via Android
    @kslr 我觉得这位大佬说的不错
    omph
        5
    omph  
       2018 年 5 月 26 日   1
    把脚本输出重定向到后端里,运行完毕,由后端生成文件
    chen1164162915
        6
    chen1164162915  
       2018 年 5 月 27 日
    脚本先把文件占用了,前端请求的时候判断下占用状态
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4892 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 09:37 PVG 17:37 LAX 02:37 JFK 05:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86