Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使flask应用程序每5分钟运行一次?_Python_Python 3.x_Flask - Fatal编程技术网

Python 如何使flask应用程序每5分钟运行一次?

Python 如何使flask应用程序每5分钟运行一次?,python,python-3.x,flask,Python,Python 3.x,Flask,我有这个应用程序,它可以按照我想要的方式工作,但现在我希望它每5分钟从一些虚拟机抓取一次实时数据。在下面的代码中,我将它设置为每10秒更新一次,只是为了看看它是否有效,但什么都没有发生。我在利用时间睡觉。我还缺什么 import time from flask import Flask, render_template from testapi import grab_cpu app = Flask(__name__) starttime = time.time() while True:

我有这个应用程序,它可以按照我想要的方式工作,但现在我希望它每5分钟从一些虚拟机抓取一次实时数据。在下面的代码中,我将它设置为每10秒更新一次,只是为了看看它是否有效,但什么都没有发生。我在利用时间睡觉。我还缺什么

import time
from flask import Flask, render_template
from testapi import grab_cpu

app = Flask(__name__)

starttime = time.time()
while True:

    machines =["build05", "build06", "build07","build08", "build09", "build10", "build11", "build12","build14","build15", "winbuild10","winbuild11", "winbuild12", "winbuild13", "wbuild14", "wbuild15", "winbuild16", "winbuild17", "winbuild18"] 

    cpu_percentage =[grab_cpu("build05"), grab_cpu("build06"),grab_cpu("build07"),  
            grab_cpu("build08"), grab_cpu("build09"), grab_cpu("build10"), grab_cpu("build11"), grab_cpu("build12"), grab_cpu("build13"), grab_cpu("build14"), grab_cpu("build15"), grab_cpu("winbuild10"), grab_cpu("winbuild11"), grab_cpu("winbuild12"), grab_cpu("winbuild14"), grab_cpu("winbuild15"), grab_cpu("winbuild16"), grab_cpu("winbuild17"), grab_cpu("winbuild18")] 

    @app.route("/")  # this sets the route to this page
    def home():
        return render_template('testdoc.html', len = len(machines), machines = machines, cpu_percentage = cpu_percentage)

    app.run(use_reloader = True, debug = True) 
    time.sleep(10.0 - ((time.time() - starttime) % 10.0))
编辑(这是一个更新的建议,它仍然没有工作,因为我想): 编辑另外2条信息:我有一个文件,其中有一个函数grab_cpu,它对vm进行api调用并返回使用率百分比。我有另一个名为test doc.html的文件,它只显示html。从这些回答中,我猜我需要使用一些javascript和带有套接字的东西。有人能给我一个链接指出正确的方向吗

import time
from flask import Flask, render_template
from testapi import grab_cpu

app = Flask(__name__)



@app.route("/")  # this sets the route to this page
def home():
    starttime = time.time()

    while True:
        machines =["build05", "build06", "build07","build08", "build09", "build10", "build11", "build12","build14","build15", "winbuild10","winbuild11", "winbuild12", "winbuild13", "wbuild14", "wbuild15", "winbuild16", "winbuild17", "winbuild18"] 

        cpu_percentage =[grab_cpu("build05"), grab_cpu("build06"),grab_cpu("build07"),  
            grab_cpu("build08"), grab_cpu("build09"), grab_cpu("build10"), grab_cpu("build11"), grab_cpu("build12"), grab_cpu("build13"), grab_cpu("build14"), grab_cpu("build15"), grab_cpu("winbuild10"), grab_cpu("winbuild11"), grab_cpu("winbuild12"), grab_cpu("winbuild14"), grab_cpu("winbuild15"), grab_cpu("winbuild16"), grab_cpu("winbuild17"), grab_cpu("winbuild18")] 
        return render_template('testdoc.html', len = len(machines), machines = machines, cpu_percentage = cpu_percentage)
        time.sleep(10.0 - ((time.time() - starttime) % 10.0))
app.run(use_reloader = True, debug = True) 
    
以下是网页:


谢谢。

您的代码需要一些工作,Flask视图不应该在循环中声明。我建议如下:

  • 从while回路内部移除烧瓶视图
  • 也在循环外部声明服务器
  • 在函数中编写代码
  • 运行while循环,只需调用函数即可从源代码中获取信息
  • 基于我认为只是一个运行中的示例,我还将对您的需求做出一些假设:

    • 这不完全是您的代码
    • 您的代码工作得很好,但缺少此实现
    • 您的项目具有一定程度的复杂性
    • 您需要在其他地方显示此数据
    基于这些(或许还有其他条件),我想说,你有两种方法可以有效地实现你所需要的:

  • (不推荐)创建Cron作业并在专用脚本中运行所有内容
  • (我最喜欢的)将脚本的逻辑封装在Flask API调用、方法或函数中,并将其声明为芹菜任务,计划每5秒运行一次,更新数据库,并使用具有某种JS反应性的视图实时显示数据

  • 我建议不要使用Flask来处理调度。烧瓶要求的预期流量为:

  • 从浏览器接收HTTP请求
  • 尽可能快地生成响应(理想情况下在几毫秒内,但几乎总是少于几秒钟)
  • 将响应返回到浏览器
  • 上面代码的意图似乎是使用Flask将更新向下推送到浏览器,但Flask只能响应传入的请求,而不能强制浏览器进行更改

    对于您正在描述的用例,一个更简单的解决方案是在浏览器中处理刷新逻辑

    对于一个非常基本的示例,请将其放入
    testdoc.html
    模板中:

    
    setTimeout(函数(){
    location.reload();
    }, 10 * 1000);
    
    不要这样做。将您的查询移动到
    home
    路径中,并将其移动到redis或类似的缓存系统后面,以避免多次运行这种昂贵的操作。我看不出您使用的是任何公认的设计模式。1.拥有一个控制器进程,可以在flask应用程序中调用restful API路由,更新缓存(例如redis)2。主路径通过使用渲染模板从缓存中获取数据来显示数据。3.如果您希望客户端浏览器以不同的频率刷新页面,请使用一点JS和重新加载的
    setinterval()
    page@RobRaymond我想我不是。我两天前才学会烧瓶。还在学习。谢谢你的建议。@AdamSmith你是说移动我的变量?哪项手术费用昂贵?我假设每次调用grab_cpu()都是。我很困惑为什么你不相信这是我的代码……Python语法中的基本错误让我认为这不是你的产品代码@ColorfulCodesI最终使用了除flask之外的另一种方法来获得我想要的结果,但我很欣赏这种解释。非常感谢。