为GAE中的URL Fetch服务设置异步请求的多个回调?

时间:2016-02-21 18:10:50

标签: google-app-engine callback urlfetch asynccallback google-app-engine-python

我使用的是Google App Engine(GAE),python 2.7。

GAE收到GET请求,make_fetch_call需要完成多个作业。如果'searchPortals'中只有一个对象{A()},'handleCallBack'工作正常。但是,当我在'searchPortals'中有两个对象时{A()& B()}'handleCallBack'为B()提供两次'portalObject'的引用。

1>我如何首先获得'portalObject'两次的引用,一次是A()然后是B()?

2 - ;另外,如果更好,我想为'portalObjects'中的所有对象设置单个'handleCallBack'吗?

注意 -

'Initial Id'打印两个内存引用,例如xx1和xx2。

'call back id'两次打印内存引用xx2

class SearchHandler(webapp2.RequestHandler):

    def __init__(self,*args, **kwargs):
        super(SearchHandler,self).__init__(*args, **kwargs)
        self.result=[]
        self.searchPortals = [A(), B()]
    def handleCallBack(self,rpc,portalObject):
        logging.info("call back id " + str(id(portalObject)))

    def getSearchResult(self):
        rpcs=[]
        searchKeyword=self.request.get('searchString')
        for portal in self.searchPortals:
            rpc = urlfetch.create_rpc(deadline=5)
            rpc.callback = lambda: self.handleCallBack(rpc, portal)
            urlfetch.make_fetch_call(rpc, portal.getSearchURL(searchKeyword))
            logging.info('initial id ' + ' ' + str(id(portal)))
            rpcs.append(rpc)

        for rpc in rpcs:
            rpc.wait()

        #do some processing

app = webapp2.WSGIApplication([
                               webapp2.Route(r'/search', methods=['GET'], handler='Main.SearchHandler:getSearchResult')
                               ], debug=False)

1 个答案:

答案 0 :(得分:0)

rpc.callback = lambda portal=portal: self.handleCallBack(rpc, portal)

丹尼尔提到的改变这一点解决了这个问题。