2011-10-13 14 views
5

Próbuję zoptymalizować mój kod i mam problem, którego nie rozumiem. Na każdej stronie mojej aplikacji internetowej pojawi się lista powiadomień podobnie jak nowy znacznik Facebooka. Tak więc, na każde żądanie, ten kod na początku działalności:Dlaczego moje całkowite RPC rośnie?

notification_query = db.Query(Ticker, keys_only=True)\ 
    .filter('friends =',self.current_user.key().name()) 
self._notifications_future = notification_query.run() 

Następnie, gdzie mogę znaleźć dobre miejsce, wzywam środkowy funkcję, która jest:

notification_keys = [future.parent() for future in self._notifications_future] 
self._notifications = db.get_async(notification_keys) 

końcu je wszystkie pobrać na koniec:

context.update({'notifications': self._notifications.get_result() }) 

Każda rzecz działa świetnie z wyjątkiem: jeśli zadzwonię środkowy funkcję w końcu funkcji żądanie użytkownika, otrzymuję to:

Dumb spot

Dumb spot

i jeśli nazwać to, co myślę, że jest zoptymalizowany spot, uzyskać to:

Inteligentne Spot

Smart spot

Jak widać wykorzystanie interfejsu API jest podwojone dzięki tej "optymalizacji". Co tu się dzieje?

Numer wywoławczy 2, jest pierwszym fragmentem w obu przypadkach. Numer wywoławczy 12 w miejscu głupie to drugi fragment, a numer wywoławczy 12 w inteligentnym miejscu to drugi fragment. Ten ostatni przełącznik nie ma nic wspólnego z problemem, przetestowałem go.

pd: Czy Google obciąża mnie za czas, że zapytanie jest "bezczynne"?

UPDATE

Problem wydaje się być po prostu w dev_server, kiedy próbowałem ten sam przykład (inteligentnej) na appspot, mam to:

Pytania na appspot

appspot

Tutaj wszystko działa zgodnie z oczekiwaniami, rzeczy, które nazywane są run() lub get_async() nie blokuj innych rzeczy. Jak już powiedziałem, problem występuje tylko w dev_server. Mimo to byłoby miło zobaczyć tę funkcję działającą na localhost, dla bardziej efektywnego profilowania.

Odpowiedz

1

Ahhhh. Jest to bardzo pomocne, gdy publikujesz informacje o silniku aplikacji, aby wspomnieć, czy Twoje wyniki znajdują się na serwerze dewelopera, czy w fazie produkcji. Serwer dev nie ma takich samych cech wydajności jak serwery produkcyjne, więc nie jest to najlepszy sposób na profilowanie aplikacji. W rzeczywistości uważam, że indeksy nie są w ogóle używane, a serwer dev jest pojedynczy wątek, więc nie można obsłużyć z nim współbieżnych żądań. W rzeczywistości, jeśli Twoja aplikacja nawiąże połączenia z samą sobą, it won't work at all!

+0

kodujesz i się uczysz, prawda? – fceruti

+2

hmmm. dla mnie uważam, że sekwencja jest czymś w rodzaju kodu, a następnie koduje więcej, następnie przeklinam, następnie uderzam głową o ścianę, a następnie debuguję, a następnie koduję trochę więcej, a następnie uczę się odrobinę :) –

3

Oprócz notatki Petera należy pamiętać, że Appstats nie ma możliwości dowiedzenia się, kiedy faktycznie wykonuje się żądanie asynchroniczne, z wyjątkiem sytuacji, gdy pobierasz wynik. W rezultacie nawet szybkie połączenia będą wyglądać powoli, jeśli zażądanie wyniku zajmie dużo czasu.

+0

dobra obserwacja. dzięki! – fceruti

Powiązane problemy