5

は、私は2つの非同期ミックスイン(ThreadingMixInとはForkingMixInが)ThreadingMixIn用のプールとSocketServer用のForkingMixInはありますか?

彼らはそれぞれの要求に取り組むこれら二つの問題点(新しいスレッドやフォークを割り当てましたSocketServer に基づいていますBaseHttpServerを使用してHTTPプロキシを作成しようとしていました

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

これは大きなパフォーマンスの向上につながるため、一部のリソースを節約できると思うからです。

答えて

1

私はあなたからプールを使用することができます多分あなたは(CTRL + Cの後にクリーンアップ)TODOのを終える私に参加したい、この問題に

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

を解決プロジェクト

+0

https://pypi.python.org/pypi/Spawning/ –

+0

のようなイベントレットベースのサーバーと比較する必要があるかもしれませんが、これはpy 2.7を使用しても機能しません。 pickle.PicklingError:をpickleできません:thread.lockとして見つかりません – OriginalCliche

+0

私はpy 2.7を使用していますが、私のコードは何もピクルしません –

5

を開始しました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に保存した場合のように、あなたはそれを実行できます。このコマンドはhttp://your_host:8000/上の要求にサービスを提供するために40件のスレッド件まで使用しています

$ python -mserver 

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

+0

これはあなたのデモを試してみるときにこのエラーが出ます。マルチプロセッシングプールの使用に似ていますが、これは最適な解決策ではありません。たとえば、キュ​​ーやピクルスなどがあります。 [my solution](https://github.com/muayyad-alsadi/python-PooledProcessMixIn/wiki)の機能をご覧ください。 –

+0

@muayyad:1.これはstdlibクラスと同様に開発/テストのためのクラスです。2.私は、単純さのために上記のことができると思います。私はあなたの解決策について同じことを言うことはできません3.ベンチマークはありますか? – jfs

+1

@ j-f-sebastian:私はベンチマークのために包囲攻撃を使用しました。これはパフォーマンスを倍増させます(私のトランスレート:1530、他のミックスインは約800) –

関連する問題