5

Cercavo di fare un proxy http utilizzando BaseHTTPServer che si basa su SocketServer cui schiera 2 asincrono Mixin (ThreadingMixIn e ForkingMixIn)c'è qualche pool per ThreadingMixIn e ForkingMixIn per SocketServer?

il problema con quei due che lavorano su ogni richiesta (assegnare un nuovo filo o forcella un nuovo sottoprocesso per ogni richiesta)

c'è un Mixin che utilizza un pool di diciamo 4 sottoprocessi e 40 thread in ogni così le richieste vengono gestite da quelle discussioni già create?

perché questo sarebbe un grande guadagno in termini di prestazioni e suppongo che salverebbe alcune risorse.

risposta

1

Ho iniziato un progetto che risolve questo problema

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

forse si vuole unirsi a me finire la TODOs (pulire dopo CTRL + C)

+0

Potrei aver bisogno di confrontarlo con server basati su eventlet come https://pypi.python.org/pypi/Spawning/ –

+0

questo non funziona più usando py 2.7. Ottengo questo errore quando provo il tuo demo: pickle.PicklingError: Non posso mettere sottotaglio : non è stato trovato come thread.lock – OriginalCliche

+0

Sto usando py 2.7, e il mio codice non mette in sottaceti nulla –

5

si potrebbe usare una piscina dal concurrent.futures (in stdlib dal Python 3.2):

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

Come si può vedere l'implementazione per un caso di filettatura è piuttosto banale.

Se si salva a server.py allora si potrebbe eseguire come:

$ python -mserver 

Questo comando utilizza fino a 40 thread per servire le richieste su http://your_host:8000/.

Il caso d'uso principale di HTTPServer è a scopo di test.

+0

è simile all'utilizzo del pool di multiprocessing e questa non è la soluzione ottimale, ad esempio si tratta di code e sottaceti ..etc. per favore vedi [la mia soluzione] (https://github.com/muayyad-alsadi/python-PooledProcessMixIn/wiki). –

+0

@muayyad: 1. questo così come le classi stdlib sono a scopo di sviluppo/test 2. Posso aspettarmi che quanto sopra funzioni per la sua semplicità. Non posso dire lo stesso della tua soluzione 3. hai qualche benchmark? – jfs

+1

@ j-f-sebastian: ho usato l'assedio per il benchmark, raddoppia le prestazioni (tasso mini transazioni: 1530, altri mixin circa 800) –