0

I am using Google App Engine(GAE), python 2.7.

A GET request is received by the GAE and multiple jobs are required to be done by make_fetch_call. If I have only one object{A()} in 'searchPortals', 'handleCallBack' works fine. However, when i have two objects in 'searchPortals' { A() & B() } the 'handleCallBack' gives the reference of 'portalObject' twice for B().

1> How do i get the reference of 'portalObject' twice once first for A() and then for B() ?

2> Also, if preferable, i want to have single 'handleCallBack' implementation for all the objects in 'portalObjects' ?

Note -

'Initial Id' prints two memory reference say xx1 and xx2.

'call back id' prints memory references twice 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)
Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
Russell
  • 361
  • 1
  • 8
  • 24

1 Answers1

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

Changing this as mentioned by Daniel solved the issue.

Russell
  • 361
  • 1
  • 8
  • 24