0

いくつかのPythonスクリプトを提供する方法を決定するのにかなりの問題があります。

問題は、基本的な機能がこれによって一般化される可能性があることです。

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

さまざまなWSGIサーバーを試しましたが、使用するスレッドの数などを指定する必要があるため、すべてのサーバーで同時実行の制限がありました。

サーバー上のリソースが効率的かつ自由に使用されることだけを望んでいます。



何か案は?

4

4 に答える 4

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()
于 2010-04-22T17:55:10.460 に答える
1

スポーンがぴったりだと思うかもしれません。展開にはいくつかのオプションがあり、そのうちの1つは(Eventletによって実装されているように)ある程度透過的な非同期です。だからあなたが文字通りそうするならtime.sleep(3)それは大丈夫でしょう。実行する可能性のあるすべてが透過的に処理されるわけではないため、Eventletとその動作に注意を払う必要があります。たとえば、ソケットはソケットであるため、ソケット(およびそのソケットブロック)から読み取る場合、サーバーを停止したり、スレッドを消費したりすることはありません。ただし、CPUを大量に使用する作業を行うと、すべての要求がブロックされます。だから...それは少しトリッキーです。スポーンには、他にもいくつかのデプロイメントオプションがあります。

いくつかの落とし穴がありますが、 WaitForItを使用できる場合があります。長時間実行されるリクエストのスレッドを生成し、ブラウザのフィードバックを提供するため、長時間実行されるバックエンドプロセスに対して非常に単純なフロントエンドを作成する場合に役立つことがあります。WSGIミドルウェアとして機能します。

于 2010-04-22T19:13:15.327 に答える
0

それで、クライアントが3秒間応答を待つことに縛られても問題ありませんが、サーバーには問題がありますか?それは...奇妙なようです。

クライアントを3秒間拘束したくない場合、一般的なメカニズムは、最初のリクエストがステータスモニターへのURLとともに「202Accepted」をできるだけ早く返すようにすることです。次に、サーバーはタスクの新しいスレッドまたはサブプロセスを生成でき、クライアントは他のことを実行できます。次に、ステータスURLをポーリングして、タスクがいつ完了したかを確認します。

于 2010-04-22T20:27:00.880 に答える
0

CherryPy WSGIサーバーはどうですか?

それsleepはどういう意味ですか?あなたは本当にウェブアプリケーションを書いていますか?

于 2010-04-22T15:33:23.847 に答える