【问题标题】:How to continuously read data from xively in a (python) heroku app?如何在(python)heroku 应用程序中从 xively 连续读取数据?
【发布时间】:2014-04-16 09:37:02
【问题描述】:

我正在尝试用 python 编写一个 Heroku 应用程序,它将实时读取和存储来自 xively 提要的数据。我希望应用程序作为一种“后端进程”独立运行,以简单地将数据存储在数据库中。 (它不需要为用户(网站访问者)“提供”任何东西。)

现在我正在研究“持续阅读”部分。我在下面包含了我的代码。每次我点击应用程序的 Heroku URL 时,它都会读取一次数据流。如何让它持续运行,以便它不断地从 xively 读取数据?

import os
from flask import Flask
import xively

app = Flask(__name__)

@app.route('/')
def run_xively_script():

   key = 'FEED_KEY'  
   feedid = 'FEED_ID'  


   client = xively.XivelyAPIClient(key) 
   feed = client.feeds.get(feedid)
   datastream = feed.datastreams.get("level")

   level = datastream.current_value


   return "level is %s" %(level)

我是 web 开发、heroku 和 python 的新手......我非常感谢任何帮助(指针)

{ PS: 我已经阅读了有关 Heroku Scheduler 的信息,据我了解,它可用于以特定的时间间隔安排任务,当它这样做时,它会为该任务启动一个一次性的测功机。但正如我所提到的,我的应用程序实际上只执行一个功能-> 不断地从 xively 读取和存储数据。是否有必要为此安排单独的任务?调度程序将启动的一次性测功机也将消耗测功小时,我认为这将超过免费的 750 测功小时限制(因为我的应用程序的网络测功机每月已经消耗 720 个测功小时)...... }

【问题讨论】:

    标签: python heroku flask xively


    【解决方案1】:

    正如您和@Calumb 所建议的那样,使用调度程序是解决此问题的一种方法。

    另一种方法是在 Xively 上设置触发器。 https://xively.com/dev/docs/api/metadata/triggers/

    在您的 Feed 更新时触发。触发器应该 POST 到您的 Flask 应用程序,然后 Flask 应用程序可以获取新数据,对其进行操作并根据需要存储它。我认为这将是最接近实时的,因为 Xively 正在将更新推送到您的系统。

    【讨论】:

    • 感谢您的意见。这似乎是最实时(和最有效)的方法。在 xively 上设置触发器似乎很简单,但让 Flask 应用程序响应 POST 似乎很复杂......我真的很感激任何指向任何有用资源的指针/链接......
    • 我是 Flask Restful 的粉丝,因为我在 Flask 中构建 API 类接口。 Restful 使定义 GET、POST 等变得简单明了。如果您想坚持已有的内容,您的路由装饰器将类似于 @app.route('/xivelytrigger', methods=['POST'])。您的代码将读取帖子正文、解析数据并存储到数据库。然后对 Xively 的 POST 响应可能什么都不是(我认为)。我不仅和 Xively 合作过,所以我不能肯定,但 Flask POST 部分还不错。
    【解决方案2】:

    这个问题更多地是关于高级架构决策以及你想要完成的事情,而不是你应该做的具体事情。

    最终,Flask 可能不是应用程序执行您想做的事情的最佳选择。只使用纯 python 或纯 ruby​​ 会更好。话虽如此,使用 Heroku 调度程序(你提到的)可以做你想做的事情。

    实现目标的最简单方法(假设您想要更改最少的代码,并且不断读取数据确实是您想要做的。您应该考虑这两者)是编写一个循环,当您调用该任务并抓取数据几秒钟。只需使用 for 循环并增加一个计数器,无论您想获取多少次数据。

    类似:

    for i in range(0,5):
        key = 'FEED_KEY'  
        feedid = 'FEED_ID'  
        client = xively.XivelyAPIClient(key) 
        feed = client.feeds.get(feedid)
        datastream = feed.datastreams.get("level")
    
        level = datastream.current_value
    
        time.sleep(1)
    

    但是,Heroku 对某些东西在返回值之前可以运行多长时间有限制。否则路由器将返回 503 或 500。但您可以使用调度程序来安排它每隔一定时间运行一次。

    再一次,我认为 Flask 和 Heroku 并不是你想要做的最好的解决方案。我会审查您的用例,然后回到绘图板上,了解实现它的最佳方法。

    【讨论】:

    • 我开始怀疑(并担心)(Heroku + Flask 应用程序)不是我想做的事情的理想方式...... xively 上的数据将每 20 秒更新一次因此必须每 20 秒存储一次。从你所说的(503/500 ...)和Heroku调度程序至少以10分钟间隔工作的事实来看,我猜Heroku调度程序和循环方法不起作用? (@TimothySwieter)(不过我会试一试......)谢谢你的帮助!
    • 我尝试使用循环作为和(正如你所提到的),当我点击我的 URL 时,应用程序执行它的功能大约半分钟,然后我的浏览器上出现“应用程序错误”。 heroku 日志说: {heroku[router]: at=error code=H12 desc="Request timeout" method=GET path=/ host=... request_id=...fwd="..." dyno=web. 1 连接=1ms 服务=30000ms 状态=503 字节=0}。循环方法从一开始就注定要失败:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2010-12-08
    • 2022-09-27
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多