2011-10-13 23 views
5

我試圖優化我的代碼,並且遇到了一個我不太明白的問題。在我的網絡應用程序的每個頁面上,都會有一個類似於Facebook新報價的通知列表。因此,在每次請求,我在beggining運行這段代碼:爲什麼我的RPC總數增加了?

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

然後,在我找到一個好去處,我調用中間函數是:

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

最後我取他們所有結尾:

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

每一件事情的作品,除了這個偉大的:如果我調用請求的功能結束,中間的功能,我得到這個:

阿呆現貨

Dumb spot

,如果我把它在我認爲是一個優化的地方,我得到這個:

智能現貨

Smart spot

正如你所看到的通過進行這種「優化」,API使用量翻了一番。這裏發生了什麼?

電話號碼2是這兩種情況下的第一個片段。在啞點中的呼叫號碼12是第二個片段,並且智能點中的呼叫號碼12是第二個片段。這最後一個開關,與問題無關,我測試過了。

pd:谷歌收取我的時間查詢是「閒置」?

UPDATE

這個問題似乎只是在dev_server,當我試圖在Appspot上相同的例子(智能版),我得到這個:

查詢上Appspot上

appspot

這裏的一切都按預期工作,所調用的東西run()get_async()不要阻止其他的東西。正如我所說的問題只在dev_server。儘管如此,我們仍然很高興看到這個特性可以在localhost上工作,以獲得更有效的分析。

回答

1

Ahhhh。在發佈應用引擎時,如果您的結果在開發服務器或生產環境中,這是非常有用的。開發服務器沒有與生產服務器相同的性能特徵,因此它不是剖析應用程序的最佳方式。實際上,我相信索引根本不用,而且開發服務器是單線程的,所以你不能用它處理併發請求。事實上,如果你的應用程序打電話給自己,it won't work at all

+0

你的代碼和你學習,對吧? – fceruti

+2

嗯。對我來說,我認爲序列是類似代碼的東西,然後編碼一些,然後詛咒,然後將我的頭靠在牆上,然後調試,然後編碼一些,然後學習一點點:) –

3

除了Peter的說明,您應該記住,除非您獲取結果,否則Appstats無法知道異步請求何時實際完成。因此,如果您花費很長時間請求結果,則即使快速撥打電話也會顯得很慢。

+0

好觀察。謝謝! – fceruti

相關問題