如何在(python)heroku应用程序中从xively连续读取数据?

时间:2014-04-16 09:37:03

标签: python heroku flask xively

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

现在我正在进行连续阅读'部分。我在下面提供了我的代码。它只是读取数据流一次,每次我点击我的应用程序的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)

我是网络开发,heroku和python的新手...我真的很感激任何帮助(指针)

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

最终,Flask可能不是应用程序执行您要执行的操作的最佳选择。只用纯蟒蛇或纯红宝石你会更好。话虽如此,使用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并不是你想要做的最好的解决方案。我会检查你的用例,然后回到绘图板,了解实现它的最佳方法。