2011-03-24 37 views
1

我聽說默認情況下,Web.py是多線程Web服務器。因此創建了一個簡單的應用程序,在返回「Hello World」之前睡了一分鐘。Web.py:無法使用多個瀏覽器標籤獲取多線程行爲

現在,如果我幾乎同時調用從兩個不同的瀏覽器這個應用程序(即http://localhost:8080/),我得到的「Hello World」幾乎同時在這兩種瀏覽器在60秒之後 - 這表明在Web.py端的多線程工作正常。

但是,如果我打開在同一個瀏覽器兩個選項卡,並幾乎同時調用相同的URL(相隔幾秒鐘),我得到了第一個選項卡中的「Hello world」 60秒後如預期,然後這個「Hello World 「在第一個響應60秒後的第二個標籤中。這是總共120秒。因此表明Web.py不會執行多線程。

我想最終創建一個python客戶端應用程序(使用httplib2),它將發出來自不同線程的http請求。那些來自不同線程的http請求可能完全相同。我假設或多或少類似於在同一瀏覽器中從不同標籤發出http請求。

在這種情況下如何獲得多線程行爲的任何想法?或者我做錯了什麼?任何特殊的web.py配置都需要?或任何其他(簡單)網絡框架,將做我所期望的。

回答

5

您描述的行爲似乎是特定於某些瀏覽器。在花時間重新創建您的情況後,即創建一個簡單的web.py應用程序,然後在回答請求之前休眠一段時間,然後我可以在Firefox中重新創建問題。在IE8中使用兩個選項卡試用相同的方法實際產生了最初的預期結果:兩個請求都被同時處理。

這使我相信問題是與瀏覽器相關,而不是web.py的問題。很可能,某些瀏覽器會將對相同URL或域所做的請求排隊,而不是一次發送全部請求。

多線程或多處理的Python應用程序不應該遭受同樣的問題。

爲了參考的目的,這是簡單的web.py應用我公司生產,使用基本教程:

#!/usr/bin/env python 

import time, web 

urls = (
    '/', 'index' 
) 

web.config.debug = False 
app = web.application(urls, globals()) 

class index: 
    def GET(self): 
     time.sleep(10) 
     return "Hello, world!" 

if __name__ == "__main__": 
    app.run() 
+1

感謝您的回答。我只嘗試過FF和Chrome。我在IE中再次嘗試了它,你完全正確 - 我在同一時間在兩個選項卡中都得到了響應。然後我創建了一個多線程的python程序來同時發出兩個urllib.urlopen()請求。兩個線程都同時得到響應。 – 2011-03-24 14:15:58

+0

是的!我剛剛使用多線程Tornado引擎發現了同樣的事情。我很感興趣,看看這是否在ajax請求中做了同樣的事情。 – Humphrey 2011-11-16 01:20:17

相關問題