如何在(Python)Heroku应用程序中持续从Xively读取数据?

2024-07-05 11:07:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用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还不熟悉。。。我非常感谢你的帮助(指点)

在{ 附言: 我读过Heroku Scheduler,据我所知,它可以用于在特定的时间间隔安排任务,当它这样做时,它会为任务启动一次性动态。但正如我所提到的,我的应用程序实际上只执行一个功能,即连续读取和存储来自xively的数据。有必要为此单独安排一项任务吗?调度器启动的一次性动态测功机也将消耗动态测功机小时数,我认为这将超过750小时的免费测功机小时数限制(因为我的应用程序的网络测功机每月已消耗720个测功机小时)。。。 }在


Tags: 数据keyimportclientapp应用程序flaskheroku
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 and Heroku并不是你想要做的最好的解决方案。我会回顾一下你的用例,然后回到绘图板上,找出实现它的最佳方法。在

正如您和@Calumb所建议的那样,使用调度程序是实现这一目标的一种方法。在

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

在更新feed时触发。触发器应该发布到您的Flask应用程序,然后Flask应用程序可以获取新数据,对其进行操作并按您的意愿存储。我认为这是最接近实时的,因为Xively正在向您的系统推送更新。在

相关问题 更多 >