2012-05-07 15 views
0

我有每一個實例被加載時服務我一個空白頁AppEngine上的問題。 這是一個類似的問題已經覆蓋here,但是,有沒有提到建設性的解決辦法,這將有助於我的情況。AppEngine在第一個請求上提供空白頁面 - 第一個和後續實例負載之間有什麼區別?

由於有在控制檯中沒有錯誤,這一次似乎是非常難調試,我真不知道該如何下手。我沒有在前面的文章中提到的解決方案,因爲我不想重命名我的任何文件,並且希望保持現在的代碼組織。

最後,問一個更廣泛的問題 - 就是第一和後續請求的每個實例的處理有什麼區別?開發人員應該注意什麼嗎?

那麼到底發生了什麼 - 如果AppEngine上的代碼加載的第一次,我得到一個空白頁。每一個後續的請求都很好。我想我的代碼所需的全部零件那裏,以防萬一,這裏是來自app.yaml中(也,應用程序使用python27作爲一個平臺)的處理程序:

handlers: 
- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: /fb/.* 
    script: fbhandler.py 

- url: /xarpc/.* 
    script: xmlrpchandler.py 

- url:/
    script: main.py 

- url: .* 
    script: main.py 

有問題的處理程序是fbhandler.py。

def main(): 
    application = webapp.WSGIApplication([("/fb/", FBHandler)], debug=True) 

    util.run_wsgi_app(application) 


if __name__ == '__main__': 
    main() 

如果我檢查的AppEngine日誌,我看到這對 「空白」 的要求:

2012-05-07 10:43:14.822 /fb/?id=341108955956205 200 2998ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 
95.23.245.xx - - [07/May/2012:03:43:14 -0700] "POST /fb/?id=xxx HTTP/1.1" 200 0 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19" "xxx.appspot.com" ms=2999 cpu_ms=563 api_cpu_ms=0 cpm_usd=0.015744 loading_request=1 instance=00c61b117cb0ca2fc61adc3939c4bd034dfa416f 
I 2012-05-07 10:43:14.822 
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application. 

與此相比,任何良好的後續請求:

2012-05-07 10:44:05.479 /fb/?id=341108955956205 200 832ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19 
95.23.245.xx - - [07/May/2012:03:44:05 -0700] "POST /fb/?id=xxx HTTP/1.1" 200 483 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19" "xxx.appspot.com" ms=832 cpu_ms=1272 api_cpu_ms=1078 cpm_usd=0.035497 instance=00c61b117cb0ca2fc61adc3939c4bd034dfa416f 

,你可以看到,沒有任何明顯的錯誤消息。

更新: 經建議,我已刪除在main(),試圖排除緩存,現在的處理程序是這樣的:

application = webapp.WSGIApplication([("/fb/", FBHandler)], debug=True) 
util.run_wsgi_app(application) 

同樣的效果,首先擔起空白頁和後續加載獲取正確的數據。我注意到,不管是否上傳新代碼,如果一個實例正在運行,並且我更新了代碼,它會在第一次加載時正確顯示。我需要進入實例管理員並關閉一個重現錯誤。

更新2: 我現在試圖改變處理新python27方式:

- url: /fb/.* 
    script: fbhandler.app 

而且也相應變化的fbhandler

import webapp2 
app = webapp2.WSGIApplication([("/fb/", FBHandler)]) 

再次,同樣的問題。我也嘗試刪除調試參數沒有效果。

+0

是否有機會將app.yaml更改爲支持py27的直接指定應用程序的方式,而不是腳本文件,例如, script:myapp.app? 如果是這樣,你也加載主()(你不需要),我相信你可以看到這種行爲。 –

+0

嗨 - 我現在已經把它改成python27-way,仍然是同樣的行爲。還有一件事 - 我正在使用'threadsafe:false',這可能是一個因素嗎? – petr

回答

0

SOLUTION

我現在似乎已經找到了解決辦法。當我將所有應用程序處理程序升級到webapp2並使用引用它們的新方法時,它現在似乎在沒有第一次加載錯誤的情況下工作。

3

您遇到此問題是由於應用程序引擎緩存你的CGI處理程序的方式。 如果在runtime documentation看(CGI腳本處理程序也可以緩存 部分),你可以看到:

你可以告訴App Engine的緩存CGI處理程序腳本本身,除了導入模塊。如果處理程序腳本定義了一個名爲main()的函數,那麼腳本及其全局環境將像導入的模塊一樣被緩存。對給定Web服務器上的腳本的第一個請求通常會對腳本進行評估。對於後續請求,App Engine將在緩存環境中調用main()函數。

要確保即使在實例啓動期間您的處理程序也能正常工作,請確保將WSGI應用程序定義爲全局變量(在main之外)。

+0

好的,我現在得到了不同 - 但仍然,它爲什麼會有不同的表現?代碼的所有必需部分都在那裏。將嘗試全局定義應用程序,使util運行主要方法的唯一內容 – petr

+0

不真正幫助 - 我現在已經嘗試刪除「主要」 - 添加一個空白參數應該阻止它被緩存。同樣的行爲。 – petr

相關問題