我正在使用RPC来异步获取多个URL。我正在使用全局变量来跟踪完成情况,并注意到在RPC调用完成之前和之后,该全局内容的内容完全不同。
感觉我错过了一些明显的东西......当回调发生时,rpc.wait()是否有可能导致应用程序上下文被加载到新实例上?
这是基本模式......
aggregated_results = {}
def aggregateData(sid):
# local variable tracking results
aggregated_results[sid] = []
# create a bunch of asynchronous url fetches to get all of the route data
rpcs = []
for r in routes:
rpc = urlfetch.create_rpc()
rpc.callback = create_callback(rpc,sid)
urlfetch.make_fetch_call(rpc, url)
rpcs.append(rpc)
# all of the schedule URLs have been fetched. now wait for them to finish
for rpc in rpcs:
rpc.wait()
# look at results
try:
if len(aggregated_results[sid]) == 0:
logging.debug("We couldn't find results for transaction")
except KeyError as e:
logging.error('aggregation error: %s' % e.message)
logging.debug(aggregated_results)
return aggregated_results[sid]
def magic_callback(rpc, sid):
# do some work to parse the result
# of the urlfetch call...
# <hidden>
#
try:
if len(aggregated_results[sid]) == 0:
aggregated_results[sid] = [stop]
else:
done = False
for i, s in enumerate(aggregated_results[sid]):
if stop.time <= s.time:
aggregated_results[sid].insert(i,stop)
done = True
break
if not done:
aggregated_results[sid].append(stop)
except KeyError as e:
logging.error('aggregation error: %s' % e.message)
KeyError在回调内部以及处理所有结果的结束时都会被抛出。这些都不应该发生。
当我打印出字典的内容时,sid实际上已经消失,但是正在处理的其他请求还有其他条目。在某些情况下,比我在相应请求开始时看到的条目更多。
在Web请求处理程序上调用此模式。不在后台。
好像,回调发生在差异实例上。
在这种情况下,sid键是包含时间字符串的字符串组合,我相信它是唯一的。