6
votes

Est-il possible d'augmenter le délai de réponse dans Google App Moteur?

sur ma machine locale, le script fonctionne bien mais dans le nuage, il 500 tout le temps. Ceci est une tâche cron, donc je ne pense pas vraiment si cela prend 5min ...

:

Une idée de savoir s'il est possible d'augmenter le délai d'attente?

merci, Rui


0 commentaires

3 Réponses :


9
votes

Vous ne pouvez pas aller au-delà de 30 secondes, mais vous pouvez augmenter indirectement le délai d'attente en utilisant des files d'attente de tâches - et une tâche d'écriture qui se déroulent progressivement dans votre ensemble de données et le traite. Chaque tâche de ce type devrait bien sûr s'intégrer dans la limite de délai d'attente.

Edit

Pour être plus précis, vous pouvez utiliser des curseurs de requête Datastore pour reprendre le traitement au même endroit:

http://code.google .COM / INTL / PL / PL / PL / DOCS / Python / DataStore / Queriesandindexes.html # Query_cursors

Introduit en premier dans le SDK 1.3.1:

http: //googleAppengine.blogspot .COM / 2010/02 / App-moteur-SDK-131-y compris-hauts.html


0 commentaires

9
votes

Les règles exactes pour les délais d'attente de requête DB sont compliqués, mais il semble qu'une requête ne puisse pas vivre plus d'environ 2 minutes et qu'un lot ne peut pas vivre plus d'environ 30 secondes. Voici quelques codes qui brise un travail en plusieurs requêtes, en utilisant des curseurs pour éviter ces délais d'attente.

def make_query(start_cursor):
  query = Foo()

  if start_cursor:
    query.with_cursor(start_cursor)

  return query

batch_size = 1000
start_cursor = None

while True:
  query = make_query(start_cursor)
  results_fetched = 0

  for resource in query.run(limit = batch_size):
    results_fetched += 1

    # Do something

    if results_fetched == batch_size:
      start_cursor = query.cursor()
      break
  else:
    break


7 commentaires

Il n'est pas exactement précis de dire "une requête ne peut pas vivre plus de 30 secondes" - voir la discussion ici, surtout le commentaire n ° 8 sur-Wards: code.google.com/p/googleAppengine/issues/detail?id=12243


@TOM: Ainsi, un lot peut fonctionner pendant 30 secondes, mais une requête peut fonctionner pendant environ 4 minutes? Si oui, comment suggérez-vous de modifier ma réponse?


En supposant @patrick Costello, c'est correct (il travaille sur Google :), je vous suggère de faire 2 modifications: 1) "Les règles exactes pour les délais d'attente de requête DB sont compliqués, mais à peu près: une requête ne peut pas vivre plus d'environ 2,5 minutes, et un lot ne peut pas vivre plus de 30 secondes ». Voici un certain code qui enfreint le travail en plusieurs requêtes, en utilisant des curseurs, pour éviter ces délais d'attente. Changement n ° 2) pour la ressource à Query.run (limite = Batch_Size):


@Tom, pouvez-vous expliquer pourquoi j'ai besoin d'ajouter .run (limite = baratat_size) sur la requête?


Bonne question! @Patrick Costello l'a inclus dans son code suggéré, alors je suis en supposant c'est correct, mais vous avez raison de vérifier! Quant pourquoi: Mon Assomption est que la limitation de la requête à la taille de "Notre lot" empêche AE de pré-exploiter des résultats / lots au-delà de notre limite. Ma compréhension est que GAE récupère automatiquement le prochain lot en tant que processus actuel, mais je ne connais pas tous les détails. Notre pause n'est pas anticipée par GAE, alors je pense que cela signifie que GAE ne peut pas optimiser ses RPCs DB avec l'indice que limite fournit. Peut-être que quelqu'un qui n'en devinait pas peut peser?


@TOM: Merci pour l'explication. J'ai lu les documents pour la classe de requête et il est indiqué que exécuter "renvoie une iérente pour la boucle sur les résultats de la requête". Il continue ensuite à dire "si vous n'avez pas besoin de modifier les valeurs d'argument par défaut, vous pouvez simplement utiliser l'objet de requête directement comme une version iérente pour contrôler la boucle. Cela appelle implicitement exécuté () avec des arguments par défaut." Puisque nous changeons les arguments par défaut, nous devons l'appeler. Faire la modification maintenant.


super! Maintenant, nous devons obtenir cette réponse comme le «accepté». C'est certainement plus utile que les autres.



1
votes

ci-dessous est le code que j'utilise pour résoudre ce problème en brisant une seule grande requête en plusieurs petites. J'utilise le google.appengine.ext.ndb bibliothèque - je ne sais pas si cela est requis pour le code ci-dessous pour fonctionner.

(Si vous n'utilisez pas NDB, envisagez de passer à C'est une version améliorée de la bibliothèque de DB et la migration de celle-ci est facile. Pour plus d'informations, voir https://developers.google.com/appengine/docs/python/ndb .) xxx


0 commentaires