【问题标题】:Run function when task queue is empty on appengine当 appengine 上的任务队列为空时运行函数
【发布时间】:2011-04-05 02:21:58
【问题描述】:

我每天都有一项 cron 工作来调用 API 并获取一些数据。对于每一行数据,我启动一个任务队列来处理数据(这涉及通过进一步的 API 查找数据)。一旦所有这些都完成了,我的数据在接下来的 24 小时内都不会改变,所以我将其存储在内存中。

有没有办法知道我排队的所有任务何时完成,以便我可以缓存数据?

目前我只是安排两个这样的 cron 作业,以一种非常混乱的方式来做这件事:

class fetchdata(webapp.RequestHandler):
def get(self):
    todaykey = str(date.today())
    memcache.delete(todaykey)
    topsyurl = 'http://otter.topsy.com/search.json?q=site:open.spotify.com/album&window=d&perpage=20'
    f = urllib.urlopen(topsyurl)
    response = f.read()
    f.close()

    d = simplejson.loads(response)
    albums = d['response']['list']
    for album in albums:
        taskqueue.add(url='/spotifyapi/', params={'url':album['url'], 'score':album['score']})

class flushcache(webapp.RequestHandler):
    def get(self):
        todaykey = str(date.today())
        memcache.delete(todaykey)   

然后我的 cron.yaml 看起来像这样:

- description: gettopsy
  url: /fetchdata/
  schedule: every day 01:00
  timezone: Europe/London

- description: flushcache
  url: /flushcache/
  schedule: every day 01:05
  timezone: Europe/London

基本上 - 我猜测我的所有任务运行时间不会超过 5 分钟,所以我只在 5 分钟后刷新缓存,这样可以确保缓存数据时它是完整的。

有没有更好的编码方式?感觉我的解决方案不是最好的......

谢谢 汤姆

【问题讨论】:

    标签: python google-app-engine cron task-queue


    【解决方案1】:

    目前没有任何方法可以确定您的任务何时完成执行。您最好的选择是在数据存储中插入标记记录,并让每个任务在完成后删除其记录。然后每个任务都可以检查它是否是最后一个任务,如果是,则执行清理/缓存。

    【讨论】:

    • 感谢 nick - 很高兴知道我没有错过一些明显的东西。我会试试你的建议
    【解决方案2】:

    我在处理同一问题时发现了这个问题。我想出了一个不同的解决方案,我在这里发布,以防它对其他人有用。

    这不是您所要求的直接替代品,但它是相关的 - 我的问题是我想知道队列何时为空,因为这意味着复杂的后台进程已完成运行。所以我可以用检查“死人计时器”来代替检查队列大小

    deadman time 是由某个进程不断重置的计时器。当该过程完成时,计时器不会重置并最终到期。所以我让构成复杂后台进程一部分的所有不同任务重置了计时器,而不是检查队列何时为空,我有一个 cron 作业来检查计时器何时到期。

    当然,为了高效,定时器必须避免一直写入数据存储。 http://acooke.org/cute/Deadmantim0.html 的代码通过稍微放宽行为并使用 memcache 保存计时器对象的副本并仅在经过大量时间后才在存储中重置它来避免这种情况。

    ps 这比您描述的更有效,因为它不需要经常写入数据库。它也更加健壮,因为您不必准确跟踪正在发生的事情。

    【讨论】:

    • 而且它也不太健壮,因为计数器可能会因为所有正在运行的任务太慢而过期。在实践中,我猜这可能不太可能。
    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多