Question

Hey. Je travaille sur une application App Engine qui implique des requêtes à l'API Google Maps pour le géocodage. Google Maps ne aime pas les demandes trop si je mets un délai de 1 seconde entre chaque demande avec time.sleep(1).

Je remarque que mes quotas sont faibles dans mon tableau de bord GAE et a décidé de lancer un court test:

import cProfile
import time

def foo():
    time.sleep(3)

cProfile.run('foo()')

Ce qui m'a donné le résultat suivant:

   4 function calls in 3.003 CPU seconds
   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    3.003    3.003 <stdin>:1(foo)
        1    0.000    0.000    3.003    3.003 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    3.003    3.003    3.003    3.003 {time.sleep}

Il dit qu'il est consomme 3 secondes CPU pour un time.sleep(3). Maintenant, je me demande si les appels comme ceux-ci sont pris en compte pour les limites de quotas qui GAE fournit. Et si elle le fait, ce qui est l'autre façon de faire des retards entre les appels API pour le géocodage?

Merci.

Était-ce utile?

La solution

Vous ne voulez certainement pas essayer de dormir dans un système qui est entièrement conçu à partir du sol aux demandes de finition dans le temps le plus court possible absolu: D

Qu'est-ce que vous pourriez faire à la place, est de créer une tâche pour chaque géocodage, (consultez le bibliothèque ) différée. Vous voudriez spécifier une file d'attente pour cette tâche, puis juste définir la limite de vitesse sur la file d'attente à ce que vous sentez les cartes géocodage pourraient être à l'aise avec.

De cette façon, chaque géocodage fonctionnera, et vous ne serez jamais aller plus vite que la limite de vitesse que vous définissez, et vous n'avez pas besoin de faire la plomberie.

Autres conseils

Je suis assez certain que les tâches de la file d'attente comptent également vers votre utilisation du processeur dans GAP. En ce qui concerne sleep(), je ne pense pas qu'il y aura CPU « peine » de cela, mais je pense qu'il est un mauvais style.

Pourquoi le sommeil du tout? Dans votre tâche, faire un seul géocodage et poster simplement une autre invocation à vous dans la file d'attente 3secs. Voir le paramètre countdown Lorsque vous appelez http: // Code .google.com / intl / el / appengine / docs / python / TaskQueue / functions.html # add .

Votre expérience prouve que les comptes de temps de time.sleep votre quota. Jetez un oeil à l'expérimental Task Queue API . Si votre tâche n'est pas déclenchée par l'utilisateur, vous pouvez aussi utiliser les tâches de cron, mais je ne sais pas si cela va bien fonctionner avec des intervalles si petits.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top