2010-04-22 24 views
0

我在決定如何提供幾個Python腳本時遇到了相當多的問題。這個Python腳本的最佳(或適當的)WSGI服務器? - Python

的問題是,基本的功能可以通過此來概括:

do_something() 
time.sleep(3) 
do_something() 

我嘗試過各種WSGI服務器,但他們都一直給我的併發限制,如我有指定要使用多少個線程等。

我只希望服務器上的資源得到有效和寬鬆的使用。



任何想法?

回答

1

您是否使用非阻塞異步請求檢查了龍捲風?

http://www.tornadoweb.org/

我從來沒有用過它雖然,但這裏是從文檔的例子:

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() 
+0

@hadrienL由於某種原因,它僅用於在同一時間1個請求:| – RadiantHex 2010-04-22 19:55:06

0

CherryPy WSGI服務器呢?

sleep是什麼意思?你真的在寫Web應用程序嗎?

+0

@Messa:謝謝你的回覆!睡眠意味着一秒鐘腳本沒有做任何事情3秒鐘。我嘗試了CherryPy WSGI服務器,但它需要我選擇使用多少個線程,這是目前的主要限制。 – RadiantHex 2010-04-22 15:51:14

+0

對不起,我以爲CherryPy的WSGI服務器管理的線程數動態,但現在我已經看過它的源代碼,我不這麼認爲了:) – Messa 2010-04-22 19:41:13

1

您可能會發現Spawning一個不錯的選擇。它有幾個部署選項,其中之一是有點透明的異步(由Eventlet執行)。所以,如果你字面上time.sleep(3)它會沒事的。並非所有你可能做的都是透明處理,所以你必須注意Eventlet及其工作原理。例如,套接字是這樣的,如果你從套接字讀取(並且套接字塊),它不會停止服務器或使用線程。但是,如果您執行CPU繁重的工作來阻止所有請求。所以...這有點棘手。產卵有一些其他的部署選項,可能也適合你。您可以使用WaitForIt,雖然它有一些問題。這將產生線程長期運行的請求,並提供了一些瀏覽器的反饋,因此,如果您要創建一個非常簡單的前端到長期運行的後臺處理它可能是有益的。它充當WSGI中間件。

0

因此,可以讓客戶端等待3秒鐘的響應,但服務器卻不行嗎?這似乎...奇怪。

如果你寧願不是讓客戶端連接了3秒鐘,一個常見的機制是讓初始請求ASAP返回「202 Accepted」並帶有到狀態監視器的URL。然後服務器可以爲該任務產生一個新的線程或子進程,並且客戶端可以執行其他操作,然後輪詢狀態URL以查明任務何時完成。

相關問題