在appengine(python)上获取url后释放内存的最佳实践

在appengine(python)上获取url后释放内存的最佳实践,python,google-app-engine,Python,Google App Engine,我的问题是如何在appengine上最好地释放异步url获取所需的响应内存。以下是我在python中的基本操作: rpcs = [] for event in event_list: url = 'http://someurl.com' rpc = urlfetch.create_rpc() rpc.callback = create_callback(rpc) urlfetch.make_fetch_call(rpc, url) rpcs.append

我的问题是如何在appengine上最好地释放异步url获取所需的响应内存。以下是我在python中的基本操作:

rpcs = []

for event in event_list:
    url = 'http://someurl.com'
    rpc = urlfetch.create_rpc()
    rpc.callback = create_callback(rpc)
    urlfetch.make_fetch_call(rpc, url)
    rpcs.append(rpc)

for rpc in rpcs:
    rpc.wait()
在我的测试场景中,它对1500个请求执行此操作。但我需要一个体系结构,以便在短时间内处理更多的问题

然后是一个回调函数,它将任务添加到队列中以处理结果:

def event_callback(rpc):
    result = rpc.get_result()
    data = json.loads(result.content)
    taskqueue.add(queue_name='name', url='url', params={'data': data})
我的问题是,我执行了太多并发RPC调用,以致实例的内存崩溃:“在总共处理975个请求后,超过了159.234 MB的软私有内存限制”

我已经试过三种方法:

del result
del data

我在回调函数之后手动运行垃圾收集器

gc.collect()

但是,在回调函数将任务添加到队列之后,似乎没有任何东西可以直接释放内存,因此实例崩溃。还有其他方法吗?

错误的方法:将这些url放入(Put)队列,将其速率增加到所需的值(defaut:5/秒),并让每个任务处理一个url获取(或其中的一组)。请注意,安全限制为每分钟3000次url fetch api调用(并且一次url fetch可能会使用多个api调用)

也使用任务队列进行url fetch,扇出并避免耗尽内存,注册命名任务并将事件列表光标提供给下一个任务。在这种情况下,您可能希望获取+进程,而不是为每个进程注册新任务,特别是当进程还包括数据存储写入时

我还发现ndb使这些异步解决方案更加优雅


查看Brett Slatkins的谈话,也许。

虽然不是这样的解决方案,但更改实例类将增加可用内存。是的,当然-但就成本效率而言,这还不是我的最终解决方案:)任务的问题是,由于响应之前的延迟,您将需要大量实例以足够快的速度并行执行足够多的任务,这将花费大量的启动时间。嗯-当配额显示我可以进行46342179次调用时,怎么会有3000次url获取api调用/分钟的限制?每分钟3000次意味着每天4320000次呼叫免费/付费应用有不同的限制。这是一个免费的应用程序。看见如前所述,您可以将一组URL放入一个任务(10100,…)中,并立即处理它们。此外,如果应用程序使用线程,则一个实例一次可以处理多个任务。如果它达到了内存限制,那么它应该中止最近的请求(并重新安排这些请求,这样就不会丢失任何内容)我真的不明白“注册命名任务并将事件列表光标提供给下一个任务”的确切含义-我知道如何注册命名任务,但具体做了什么?我刚刚看了视频。在最初的15分钟里,一切都解释清楚了。谢谢!这就是我问题的解决办法!对于那些没有看过视频的人,命名任务用于避免分叉炸弹,否则,当任务注册新任务时,您会在失败后重新运行时注册重复任务,等等。
gc.collect()