如何计算许多GAE任务的结果?

时间:2015-03-27 09:02:05

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我运行了许多任务来获取一些信息并对其进行处理。每个任务运行后,我有一个整数,表示我已经获得了多少部分信息。 我想从不同的任务中得到这些整数的总和。

目前我使用memcache存储总和:

def update_memcache_value(what, val, how_long=86400):
    value_old = get_memcache_value(what)
    memcache.set('system_'+what, value_old+val, how_long)

def get_memcache_value(what):
    value = memcache.get('system_'+what)
    if not value:
        value = 0
    return int(value)
在每个任务中调用

update_memcache_value(通常不止一次)。但看起来像白天经常丢失的数据。我可以使用NDB来存储相同的数据,但它需要大量的写操作。有没有更好的方法来存储相同的数据(计数器)?

2 个答案:

答案 0 :(得分:2)

听起来你特别希望让很多任务完成一部分,然后将这些任务减少到一个数字......所以你想要使用MapReduce。或者你可以只使用Pipelines,因为MapReduce实际上建立在它之上。如果您担心写操作,那么您将无法利用App Engine的并行性

Google I / O 2010 - 使用Google App Engine的数据管道

https://www.youtube.com/watch?v=zSDC_TU7rtc

管道图书馆

https://github.com/GoogleCloudPlatform/appengine-pipelines/wiki

<强>的MapReduce

https://cloud.google.com/appengine/docs/python/dataprocessing/

答案 1 :(得分:0)

不幸的是,如果您的任务跨越全天,则memcache不是一个选项。

如果你想减少写操作,你可以设置第二个计数器,并在每100个任务或任何适合你的任务上备份memcache上的值。

如果您希望通过对所有任务使用write ops来执行此操作,您可以尝试通过Spreasheets API在第三方存储中备份这些结果,例如Google电子表格,但这似乎是一种过度杀伤力保存一些写操作(而不是高性能,猜测不是问题)。