Frage

Hey. Ich arbeite an einer App Engine-Anwendung, die Anfragen an die Google Maps API für die Geokodierung beinhaltet. Google Maps funktioniert nicht wie zu viel Anfragen, damit ich eine Verzögerung von 1 Sekunde zwischen jeder Anforderung mit time.sleep(1) setzen.

Ich habe bemerkt, dass meine Quoten niedrig in meinem GAE Armaturenbrett laufen und beschlossen, einen kurzen Test auszuführen:

import cProfile
import time

def foo():
    time.sleep(3)

cProfile.run('foo()')

Was mir die folgende Ausgabe hat:

   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}

So heißt es, dass es raubend 3 CPU-Sekunden für eine time.sleep(3). Jetzt frage ich mich, wenn Anrufe wie diese gezählt zu den Kontingentgrenzen, die GAE bietet. Und wenn ja, was ist der andere Weg, um Verzögerungen zwischen API-Aufrufen für die Geocodierung?

Danke.

War es hilfreich?

Lösung

Sie wollen sicher nicht in einem System versucht zu schlafen, die vollständig vom Boden bis zu Finish-Anforderungen in der absoluten kürzesten Zeit möglich gestaltet sind: D

Was man stattdessen tun könnte, ist eine Aufgabe für jede geocode erstellen, (Besuche die latente Bibliothek ). Sie würden wollen eine Warteschlange für diese Aufgabe geben, dann setzen Sie einfach die Geschwindigkeitsgrenze in der Warteschlange, was auch immer Sie die Karten fühlen Geocoder mit bequemer sein könnten.

Auf diese Weise jeder geocode läuft, und Sie werden nie gehen schneller als die Rate Ihnen festgelegten Grenzwert, und Sie brauchen keine Sanitär zu tun.

Andere Tipps

Ich bin ziemlich sicher, dass Warteschlange Aufgaben auch auf die CPU-Auslastung in GAP zählen. In Bezug auf sleep(), glaube ich nicht, dass es von den CPU „Strafe“ sein, aber ich denke, es ist ein schlechter Stil.

Warum Schlaf überhaupt? In Ihrer Aufgabe, machen einen einzigen Geokodierung und einfach posten weiteren Aufruf an sich selbst in der Warteschlange in 3secs. Siehe den Parameter countdown Wenn rufenden http: // Code .google.com / intl / el / appengine / docs / python / taskqueue / functions.html # -Add .

Ihr Experiment beweist, dass die time.sleep Zeit zählt gegen Ihre Quote. Werfen Sie einen Blick auf die experimentellen Task Queue API . Wenn Ihre Aufgabe ist nicht vom Benutzer initiiert, könnten Sie auch cron Aufgaben, aber ich weiß nicht, ob dies auch mit so geringen Abständen arbeiten.

Ausgabe berichtet, dass der Reporter wurde nicht in Rechnung gestellt für CPU-Sekunden durch time.sleep entstehen (), sondern dass sie sich auf ihre Appstats zeigen. Es ist sehr wahrscheinlich Appstats Anwendungen als auch Cprofile. Schlaf ist wichtig für Menschen, die versuchen besser asynchrone Proxies zu machen, die er für die Geocodierung größere Menge von Elementen verwenden kann.

http://code.google.com/p/googleappengine/ Fragen / detail? id = 3291

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top