BatchHttpRequest:如何从批处理中的所有请求中收集结果?

时间:2014-12-20 06:18:18

标签: python google-app-engine

我正在使用BatchHttpRequest(https://cloud.google.com/storage/docs/json_api/v1/how-tos/batch)从多个Http请求中收集结果:

for user in all_users_in_domain:
    gmail_service = build_gmail_service_for_user(user.google_user_id)
    batch.add(gmail_service.service.users().messages().list(userId='me', q=search_query), callback=get_email_list, request_id=user_id)
batch.execute()

然后我想在回调函数get_email_list中使用我自己的逻辑处理这些聚合结果

def get_email_list(request_id, response, exception):
    message_list += response['messages']

如何在所有回调中收集数组message_lists,以便对所有请求中返回的所有结果运行算法?

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,例如将代码包含在类中并附加到类属性(例如self.message_list)。

或者您可以将回调函数放在另一个函数中:

def some_outer_function():
  some_outer_function.message_list = ''

  def get_email_list(request_id, response, exception):
      some_outer_function.message_list += response['messages']

  for user in all_users_in_domain:
      gmail_service = build_gmail_service_for_user(user.google_user_id)
      batch.add(gmail_service.service.users().messages().list(userId='me', q=search_query), callback=get_email_list, request_id=user_id)
  batch.execute()

请注意,您必须符合" message_list"使用外部函数名称。如果您只是参考" message_list"您将分配给" get_email_list"的本地变量。

您也可以使用全局模块变量,但我并不是它的忠实粉丝。类方法将是我最喜欢的选项。