如何在 flask web 服务器上自动运行一个脚本 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mzmxcvbn
V2EX    Flask

如何在 flask web 服务器上自动运行一个脚本

  •  
  •   mzmxcvbn 2017-04-21 13:35:18 +08:00 6647 次点击
    这是一个创建于 3095 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想做一个工业数据监控的 B/S 系统,服务器定时采集底下硬件的数据,用户可以通过浏览器访问服务器看到实时数据。现在 flask 服务器架好了,底下数据采集的 py 脚本也写好了,但我不知道如何能让服务器一启动就一直运行那个定时采集数据的脚本,然后这个采集上来的数据应该怎么传递?

    第 1 条附言    2017-04-21 15:04:36 +08:00
    求大神能给一个方向或者思路
    24 条回复    2017-04-22 01:51:57 +08:00
    ppwangs
        1
    ppwangs  
       2017-04-21 14:53:54 +08:00
    我当时也有和你差不多同样的问题,然后用搜索引擎解决了
    zhuf
        2
    zhuf  
       2017-04-21 15:01:37 +08:00
    crontab
    mzmxcvbn
        3
    mzmxcvbn  
    OP
       2017-04-21 15:03:36 +08:00
    @ppwangs 能给个关键字吗,搜了好久了
    iPhone8
        4
    iPhone8  
       2017-04-21 15:07:02 +08:00
    二楼说的很明确了
    mlyy
        5
    mlyy  
       2017-04-21 15:09:35 +08:00 via iPhone
    celery ,注意搜 beat
    mzmxcvbn
        6
    mzmxcvbn  
    OP
       2017-04-21 15:14:46 +08:00
    @iPhone8 我这个数据获取是按秒来采集的,定时任务不行吧。。。
    HypoChen
        7
    HypoChen  
       2017-04-21 15:16:13 +08:00
    celery beat
    mzmxcvbn
        8
    mzmxcvbn  
    OP
       2017-04-21 15:18:54 +08:00
    关键不是定时,定时在数据采集的脚本用循环就好了。关键是这个脚本要跟着 web 服务一起起来,而且这个拿到的数据怎么传给服务器。
    F281M6Dh8DXpD1g2
        9
    F281M6Dh8DXpD1g2  
       2017-04-21 15:27:13 +08:00
    @mzmxcvbn 写个 shell 脚本启动服务器的时候一起调起来,数据写数据库或者随便啥 store,前端展示的时候去读
    mzmxcvbn
        10
    mzmxcvbn  
    OP
       2017-04-21 15:45:27 +08:00
    @mlyy 我想问一下 celery 能让一个 while true 死循环的任务一直运行吗,让后把收到的数据存在一个地方(循环一次更新一次), web 服务器需要的时候再从那里读这个数据
    mzmxcvbn
        11
    mzmxcvbn  
    OP
       2017-04-21 15:45:32 +08:00
    @HypoChen 我想问一下 celery 能让一个 while true 死循环的任务一直运行吗,让后把收到的数据存在一个地方(循环一次更新一次), web 服务器需要的时候再从那里读这个数据
    HypoChen
        12
    HypoChen  
       2017-04-21 15:48:54 +08:00
    @mzmxcvbn celery beat 支持每隔一定时间(精确到秒)便执行一次任务,文档有写。至于数据,直接扔数据库不好么, web server 直接去数据库拿
    wwqgtxx
        13
    wwqgtxx  
       2017-04-21 16:39:05 +08:00 via iPhone
    最简单的还是开个单独的线程 while True 跑,然后把结果丢进数据库或者消息队列
    mzmxcvbn
        14
    mzmxcvbn  
    OP
       2017-04-21 16:47:48 +08:00
    @wwqgtxx 我一开始也是这么想的,就是不知道这个线程应该在哪里开, flask 有这个启动的监控吗
    mzmxcvbn
        15
    mzmxcvbn  
    OP
       2017-04-21 16:48:15 +08:00
    @HypoChen 谢谢,我去找找
    wwqgtxx
        16
    wwqgtxx  
       2017-04-21 16:49:15 +08:00 via iPhone
    @mzmxcvbn app.before_first_request
    modm
        17
    modm  
       2017-04-21 18:23:41 +08:00 via iPhone
    apscheduler
    rookiebulls
        18
    rookiebulls  
       2017-04-21 19:43:07 +08:00 via Android
    apscheduler+1
    kingsonl
        19
    kingsonl  
       2017-04-21 22:44:31 +08:00
    apscheduler+1
    clino
        20
    clino  
       2017-04-21 22:47:17 +08:00 via Android
    jenkins buildbot
    freestyle
        21
    freestyle  
       2017-04-22 00:10:06 +08:00
    Windows 的话写个 bat/vbs 放开始菜单启动文件夹 Linux 的话选择就多了 楼上的都可以 crontab celery apscheduler

    另外实时显示数据用 websocket 优于轮询
    TJT
        22
    TJT  
       2017-04-22 00:31:35 +08:00
    apscheduler +1 , uwsgi 记得加 enable-threads ,我现在就是这么干的
    mlyy
        23
    mlyy  
       2017-04-22 00:38:14 +08:00
    @mzmxcvbn 按你的意思,我只需要客户端发 request 的时候能 response 那个时刻的真值? app.before_request 。如果采集速度够快这样就行。采集速度慢的话, celery 之类的后台挂个 beat ,一直写到数据库之类的地方,你 request 的时候去数据库拿就行(既然采集有延迟,我的理解数据有一点延迟没关系)
    lalalakakaka
        24
    lalalakakaka  
       2017-04-22 01:51:57 +08:00
    居然做了和楼主同样的事情。
    而且我懒得学新东西,不想引进去一大堆依赖库,搞的在内网机器很难部署
    我的办法是手写了个守护进程( python 程序),用 subprocess 打开所有子进程:收集器、 web 服务、数据库进程、看门狗之类的。
    然后用个 bat 文件( windows )启动这个守护程序。

    至于数据传输是用 redis 做数据中间件,如果业务毕竟简单的话,直接 redis 做数据持久化就行。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2674 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 13:47 PVG 21:47 LAX 06:47 JFK 09:47
    Do have faith in what you're doing.
    ubao 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