Ist es möglich, die Reaktionszeitüberschreitung in der Google App Engine zu erhöhen?
-
22-10-2019 - |
Frage
Auf meiner lokalen Maschine läuft das Skript gut, aber in der Cloud es ständig 500. Dies ist eine Cron -Aufgabe, daher macht es mir nichts aus, wenn es 5 Minuten dauert ...
<Klasse 'google.appengine.runtime.deadlineExecederederror'>:
Gibt es eine Idee, ob es möglich ist, die Auszeit zu erhöhen?
Danke, Rui
Lösung
Sie können nicht über 30 Sekunden hinausgehen, aber Sie können die Zeitüberschreitung indirekt erhöhen, indem Sie Aufgabenwarteschlangen verwenden - und die Aufgabe schreiben, die Ihren Datensatz allmählich wiederholen und verarbeitet. Jeder solche Aufgabe -Auslauf sollte natürlich in eine Zeitlimit -Grenze passen.
BEARBEITEN
Um genauer zu sein, können Sie DataStore -Query -Cursors verwenden, um die Verarbeitung an derselben Stelle wieder aufzunehmen:
http://code.google.com/intl/pl/appengine/docs/python/datastore/queriesandindexes.html#query_cursors
Erster in SDK 1.3.1 eingeführt:
http://googleabengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html
Andere Tipps
Die genauen Regeln für DB -Abfrage -Zeitüberschreitungen sind kompliziert, aber es scheint, dass eine Abfrage nicht mehr als etwa 2 Minuten leben kann und eine Charge nicht länger als etwa 30 Sekunden leben kann. Hier ist ein Code, der einen Job in mehrere Abfragen unterteilt, wobei Cursors verwendet werden, um diese Zeitüberschreitungen zu vermeiden.
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
Im Folgenden finden Sie den Code, den ich verwendet, um dieses Problem zu lösen, indem eine einzige große Abfrage in mehrere kleine Aufschlüsse aufgeschlüsselt wird. Ich verwende das google.appengine.ext.ndb
Bibliothek - Ich weiß nicht, ob das für den unten stehenden Code erforderlich ist.
(Wenn Sie NDB nicht verwenden, sollten Sie darauf in Betracht ziehen. Es handelt sich um eine verbesserte Version der DB -Bibliothek. Die Migration auf sie ist einfach. Weitere Informationen finden Sie unter https://developers.google.com/appengine/docs/python/ndb.)
from google.appengine.datastore.datastore_query import Cursor
def ProcessAll():
curs = Cursor()
while True:
records, curs, more = MyEntity.query().fetch_page(5000, start_cursor=curs)
for record in records:
# Run your custom business logic on record.
RunMyBusinessLogic(record)
if more and curs:
# There are more records; do nothing here so we enter the
# loop again above and run the query one more time.
pass
else:
# No more records to fetch; break out of the loop and finish.
break