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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top