7

2つの非同期ミックスイン(ThreadingMixInとForkingMixIn)を取得したSocketServerに基づくBaseHttpServerを使用してhttpプロキシを作成しようとしました。

リクエストごとに機能する2つの問題(リクエストごとに新しいスレッドを割り当てるか、新しいサブプロセスをフォークする)

たとえば、4つのサブプロセスとそれぞれに40のスレッドのプールを利用して、リクエストが既に作成されたスレッドによって処理されるMixinはありますか?

これはパフォーマンスが大幅に向上し、リソースを節約できると思います。

4

2 に答える 2

13

concurrent.futures(Python 3.2以降のstdlibで)からプールを使用できます:

from BaseHTTPServer   import HTTPServer, test
from SimpleHTTPServer import SimpleHTTPRequestHandler
from SocketServer     import ThreadingMixIn

from concurrent.futures import ThreadPoolExecutor # pip install futures

class PoolMixIn(ThreadingMixIn):
    def process_request(self, request, client_address):
        self.pool.submit(self.process_request_thread, request, client_address)

def main():
    class PoolHTTPServer(PoolMixIn, HTTPServer):
        pool = ThreadPoolExecutor(max_workers=40)

    test(HandlerClass=SimpleHTTPRequestHandler, ServerClass=PoolHTTPServer)

if __name__=="__main__":
    main()

ご覧のとおり、スレッドのケースの実装はかなり簡単です。

保存するとserver.py、次のように実行できます。

$ python -mserver

このコマンドは、最大 40 個のスレッドを使用して で要求を処理しhttp://your_host:8000/ます。

の主な使用例HTTPServerは、テスト目的です。

于 2012-08-02T17:56:49.367 に答える
3

この問題を解決するプロジェクトを開始しました

https://github.com/muayyad-alsadi/python-PooledProcessMixIn

一緒に TODO を完了してください (CTRL+C の後にクリーンアップ)

于 2012-08-02T16:25:15.050 に答える