есть ли пул для ThreadingMixIn и ForkingMixIn для SocketServer?


Я пытался сделать HTTP прокси с помощью BaseHttpServer, который основан на SocketServer который получил 2 асинхронных миксина (ThreadingMixIn и ForkingMixIn)

Проблема с теми двумя, что они работают над каждым запросом (выделяют новый поток или развивают новый подпроцесс для каждого запроса)

Есть ли миксин, который использует пул, скажем, из 4 подпроцессов и 40 потоков в каждом то есть запросы обрабатываются уже созданными потоками ?

Потому что это будет большой повышение производительности, и я думаю, что это сэкономит некоторые ресурсы.

2 6

2 ответа:

Вы можете использовать бассейн из concurrent.futures (в stdlib начиная с 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()

Как вы можете видеть, реализация для случая с потоками довольно тривиальна.

Если вы сохраните его в server.py , то вы можете запустить его как:

$ python -mserver

Эта команда использует до 40 потоков для обслуживания запросов на http://your_host:8000/.

Основной пример использования HTTPServer предназначен для целей тестирования.

Я запустил проект, который решает эту проблему

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

Может быть, вы хотите присоединиться ко мне закончить TODOs (очистить после CTRL+C)