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

如何在(python)heroku应用程序中从xively连续读取数据?,python,heroku,flask,xively,Python,Heroku,Flask,Xively,我正在尝试用python编写一个Heroku应用程序,它将实时读取和存储xively提要中的数据。我希望该应用程序作为一种“后端进程”独立运行,只需将数据存储在数据库中。(它不需要为用户(网站访问者)提供任何服务。) 现在我正在做“持续阅读”部分。我在下面包含了我的代码。每次我点击应用程序的Heroku URL时,它只读取一次数据流。我如何让它连续运行,以便它继续从xively读取数据 import os from flask import Flask import xively app =

我正在尝试用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,据我所知,它可以用来在特定的时间间隔安排任务,当它这样做时,它会为任务启动一个一次性的dyno。但正如我所提到的,我的应用程序实际上只执行一个功能->连续读取和存储xively的数据。是否需要安排一个单独的ta计划程序启动的一次性dyno也将消耗dyno小时,我认为这将超过免费750 dyno小时限制(因为我的应用程序的web dyno每月已经消耗720 dyno小时)。。。
}

这个问题更多的是关于高层架构决策和您试图实现的目标,而不是您应该做的具体事情

最终,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并不是解决你想要做的事情的最佳方案。我将回顾您的用例,然后回到绘图板上,讨论实现它的最佳方法

正如您和@Calumb所建议的,使用调度程序是实现这一点的一种方法

另一种方法是在Xively上设置触发器


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

我开始怀疑(并担心)(Heroku+Flask应用程序)不是实现我想要的目标的理想方式……xively上的数据将每20秒更新一次,因此必须每20秒存储一次。从您所说的(503/500…)以及Heroku调度器以至少10分钟的间隔工作的事实来看,我猜Heroku调度器和循环方法不会工作?(@TimothySwieter)(我会试试的…)谢谢你的帮助!我试着使用一个循环,当我点击我的URL时,应用程序执行它的功能大约半分钟,然后在我的浏览器上出现“应用程序错误”。heroku日志显示:{heroku[router]:at=error code=H12 desc=“请求超时”method=GET path=/host=…请求id=…fwd=“…”dyno=web.1 connect=1ms服务=30000ms状态=503字节=0}。循环方法从一开始就注定要失败:)谢谢你的输入..这似乎是最实时(和有效)的方法。在xively上设置触发器似乎很简单,但让Flask应用程序响应帖子似乎很复杂。。。我非常感谢任何指向任何有用资源的指针/链接……我是Flask Restful的粉丝,可以在Flask中构建类似API的接口。Restful使定义GET、POST等变得简单明了。如果您想继续使用已有的内容,那么您的路由装饰器将类似于@app.route('/xivelytrigger',methods=['POST'])。您的代码将读取文章的正文,解析数据,并存储到DB。那么,对Xively的帖子回复可能什么都没有(我认为)。我不仅和Xively合作过,所以我不能肯定,但烧瓶柱的部分还不错。