用GAE进行异步Urlfetch请求
2009 6 19 10:09 AM 3544次查看
分类:Google App Engine 标签:Google App Engine
由于之前只能使用同步Urlfetch,抓取的超时最大能设置为10秒,一次请求也必须在30秒内完成,而GAE不支持多线程,所以仅能安全地在一次请求中进行3次同步Urlfetch。
这次支持异步Urlfetch可谓是大快人心了(不知道会不会有人用来做采集…)
异步Urlfetch使用的包名仍是google.appengine.api.urlfetch,只是增加了个RPC对象而已。不过RPC这个名词都快用烂了吧,Google也不换个…
它的原理就是创建一个RPC对象,然后将这个对象传给make_fetch_call()函数进行fetch操作。这个函数将立即返回,而RPC对象则在后台进行fetch操作。
在调用RPC对象的get_result()方法时,如果尚未获取到结果,则将进入同步等待状态,直到返回结果。
此外,GAE还准备了check_success()方法让我们决定是否要get_result(),当然也可以手动调用wait()方法强行等待。
不过这样非常不智能,完全体现不出异步的优点,所以GAE理所当然地提供了callback方式:只要将RPC对象的callback属性设为想执行的callable对象(也可在构造函数里作为第2个参数),则在RPC对象获取到结果时,就将自动执行该callable对象(其第一个参数就是这个RPC对象)。
由于Google已经给出了很详细的例子了,我也就不再列出了,感兴趣的自己看看文档吧~
最后提醒一点:别忘了在最后检查一下是否所有的异步请求都结束了,否则主请求结束后,这些异步请求都会终止的。
方法也很简单,Google已经给出例子了:
for rpc in rpcs:
rpc.wait()
PS:据说SDK的Urlfetch仍是同步的,因为不支持多线程,但App Engine上则能正常支持异步。
向下滚动可载入更多评论,或者点这里禁止自动加载。