App Engine上的RPC是否会本地化为单个实例?

时间:2014-01-12 02:29:44

标签: python google-app-engine

我正在使用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键是包含时间字符串的字符串组合,我相信它是唯一的。

0 个答案:

没有答案