2010-03-14 27 views
2

我曾試圖在PHP中實現Comet。很快,我發現PHP不適用於Comet,因爲每個HTTP請求都會佔用一個進程/線程。結果,它不能很好地擴展。如何用Python實現Comet服務器端?

我剛剛在我的XAMPP中安裝了mod_python。我認爲用Python異步編程實現Comet會很容易。但仍然無法得知如何實施它。

是否有任何想法如何在mod_python中實現Comet?

+0

我想你的意思是說「Apache不適合彗星」而不是「PHP不適合彗星」 – algorithmicCoder 2011-05-25 23:16:11

回答

8

首先,我不是異步專家,我只是調查了一次這個話題。 恕我直言,如果您使用XAMPP,那麼您將失去進行長輪詢的可能性,因爲Apache使用每個請求的線程/進程(取決於配置)。

您需要的是非阻塞網絡服務器,如Tornado,它允許將請求分成兩部分,其中第二部分在某些事件中被觸發,但同時服務器可以接受後續入站請求。

來自實例Tornado documentation/license /:

class MainHandler(tornado.web.RequestHandler): 
    @tornado.web.asynchronous 
    def get(self): 
     http = tornado.httpclient.AsyncHTTPClient() 
     http.fetch("http://friendfeed-api.com/v2/feed/bret", 
       callback=self.async_callback(self.on_response)) 

    def on_response(self, response): 
     if response.error: raise tornado.web.HTTPError(500) 
     json = tornado.escape.json_decode(response.body) 
     self.write("Fetched " + str(len(json["entries"])) + " entries " 
        "from the FriendFeed API") 
     self.finish() 

- 因爲據我所知,這是不可能的Apache下 - 其中的抓取請求處理程序,這當然塊,直到它的完整的規則部分 - 所以你以凍結的線程或進程結束。

另一個在Python中使用非阻塞服務的着名庫是Twisted,但我對它的瞭解不多,只是它也能夠幫助您處理大量只有一個線程/進程的連接。

+0

感謝您的回覆。 只是想確認。對於每個HTTP請求,Apache是​​否堅持一個線程/進程是真的? – 2010-03-14 08:19:25

+0

是的,據我所知(長時間mod_wsgi + Django用戶),這是正確的。 – 2010-03-14 13:04:32

0

我不確定你是否遇到過this question,但問的問題非常相似,並且似乎有一些很好的答案。 HTH。