我使用的是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)
答案 0 :(得分:0)
rpc.callback = lambda portal=portal: self.handleCallBack(rpc, portal)
丹尼尔提到的改变这一点解决了这个问题。