我曾試圖在PHP中實現Comet。很快,我發現PHP不適用於Comet,因爲每個HTTP請求都會佔用一個進程/線程。結果,它不能很好地擴展。如何用Python實現Comet服務器端?
我剛剛在我的XAMPP中安裝了mod_python。我認爲用Python異步編程實現Comet會很容易。但仍然無法得知如何實施它。
是否有任何想法如何在mod_python中實現Comet?
我曾試圖在PHP中實現Comet。很快,我發現PHP不適用於Comet,因爲每個HTTP請求都會佔用一個進程/線程。結果,它不能很好地擴展。如何用Python實現Comet服務器端?
我剛剛在我的XAMPP中安裝了mod_python。我認爲用Python異步編程實現Comet會很容易。但仍然無法得知如何實施它。
是否有任何想法如何在mod_python中實現Comet?
首先,我不是異步專家,我只是調查了一次這個話題。 恕我直言,如果您使用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,但我對它的瞭解不多,只是它也能夠幫助您處理大量只有一個線程/進程的連接。
感謝您的回覆。 只是想確認。對於每個HTTP請求,Apache是否堅持一個線程/進程是真的? – 2010-03-14 08:19:25
是的,據我所知(長時間mod_wsgi + Django用戶),這是正確的。 – 2010-03-14 13:04:32
我不確定你是否遇到過this question,但問的問題非常相似,並且似乎有一些很好的答案。 HTH。
我想你的意思是說「Apache不適合彗星」而不是「PHP不適合彗星」 – algorithmicCoder 2011-05-25 23:16:11