Mam metodę POST
, która wywołuje kilka zadań. Te zadania mają w nich zyski i mam w moim kodzie trochę x.put_async()
. Więc nie chcę, aby powrócił, zanim wszystkie asynchroniczne rzeczy zostaną wykonane. Więc udekorowałem wszystkie moje zadania, które są tylko małymi funkcjami z @ndb.tasklet
. Ponadto, na szczycie mojej metody POST
, mam:Używanie @ ndb.tasklet lub @ ndb.synctasklet w Google App Engine
@ndb.toplevel
def post(self):
Jednak w documentation stwierdza:
Ale jeśli metoda obsługi wykorzystuje wydajność, że metoda nadal musi być zawinięte w inny dekorator, @ ndb.synctasklet; w przeciwnym razie przestanie działać przy wydajności i nie zakończy się.
Rzeczywiście moja metoda ma wydajność. Jest już zapakowany w @ ndb.tasklet. Czy zastąpię to za pomocą @ ndb.synctasklet, czy też używam obu (jeśli tak, to w jaki sposób mogę użyć obu)?
Zobacz także this thread, która ma pewne znaczenie. Zauważyłem również problem, w którym moja prośba powróciłaby bez żadnego wyjścia, ale jest nie do odtworzenia. Zdarza się co 15 minut ciągłego użytkowania. Miałem tylko app = ndb.toplevel(webapp2.WSGIApplication([..])
, ale teraz dodałem @ndb.toplevel
do głównych metod POST
, ale problem nadal występuje.
Czy powinienem wstawić @ndb.tasklet
do metod, które mają tylko put_async()
? (Należy umieścić go na górze każdej metody dla pewności Jakie są wady do tego?)
Dobra odpowiedź! Reguły można podsumować następująco: (1) jeśli funkcja używa "yield", powinno to być ndb.tasklet, ndb.synctasklet lub ndb.toplevel. (2) funkcja owinięta w ndb.tasklet zwraca Future (i możesz ją uodpornić lub wywołać get_result() jawnie). (3) ndb.synctasklet jest podobny do zawijania go w ndb.tasklet, ale niejawnie nazywa się get_result(). (4) ndb.toplevel jest podobny do ndb.synctasklet, ale czeka również na zakończenie wszystkich oczekujących operacji. –