5

starałem się zrobić proxy HTTP przy użyciu BaseHttpServer który jest oparty na SocketServer który dostał 2 asynchroniczny Wstawki (ThreadingMixIn i ForkingMixIn)czy jest jakaś pula dla ThreadingMixIn i ForkingMixIn dla SocketServer?

problem z tymi dwoma, które pracują na każde żądanie (przydzielić nowy wątek lub widelec nowy podproces dla każdego żądania) Czy istnieje Mixin wykorzystujący pulę powiedzmy 4 podprocesów i 40 wątków w każdym , aby żądania były obsługiwane przez te już utworzone wątki?

ponieważ byłby to duży wzrost wydajności i prawdopodobnie zaoszczędziłoby to trochę zasobów.

Odpowiedz

1

zacząłem projekt, który rozwiązuje ten problem,

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

może chcesz dołączyć do mnie zakończyć todos (posprzątać po Ctrl + C)

+0

Być może będę musiał porównać to z serwerami opartymi na zdarzeniach, takimi jak https://pypi.python.org/pypi/Spawning/ –

+0

to już nie działa przy użyciu py 2.7. Otrzymuję ten błąd podczas próby twojego demo: pickle.PicklingError: Can not pickle : nie został znaleziony jako thread.lock – OriginalCliche

+0

Używam py 2.7, a mój kod się nie zbiera –

5

Można korzystać z basenu concurrent.futures (w stdlib od 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() 

Jak widać wykonanie dla przypadku gwintowania jest dość trywialne.

Jeśli zapiszesz go server.py następnie można uruchomić go jako:

$ python -mserver 

Komenda ta używa zapisu do 40 wątków do obsługi żądań na http://your_host:8000/.

Głównym celem użycia HTTPServer jest do celów testowych.

+0

jest podobny do korzystania z puli wieloprocesowej, a to nie jest optymalne rozwiązanie, na przykład dotyczy kolejek i pikli ..etc. zobacz funkcje [moje rozwiązanie] (https://github.com/muayyad-alsadi/python-PooledPixessMixIn/wiki). –

+0

@muayyad: 1. to, a także klasy stdlib są przeznaczone do programowania/testowania 2. Mogę się spodziewać, że powyższe działa ze względu na swoją prostotę. Nie mogę powiedzieć tego samego o twoim rozwiązaniu 3. czy masz jakiś benchmark? – jfs

+1

@ j-f-sebastian: Używałem oblężenia do benchmarku, podwaja to wydajność (moje trans: 1530, inne mixy około 800) –

Powiązane problemy