есть ли пул для ThreadingMixIn и ForkingMixIn для SocketServer?
Я пытался сделать HTTP прокси с помощью BaseHttpServer, который основан на SocketServer который получил 2 асинхронных миксина (ThreadingMixIn и ForkingMixIn)
Проблема с теми двумя, что они работают над каждым запросом (выделяют новый поток или развивают новый подпроцесс для каждого запроса)
Есть ли миксин, который использует пул, скажем, из 4 подпроцессов и 40 потоков в каждом то есть запросы обрабатываются уже созданными потоками ?
Потому что это будет большой повышение производительности, и я думаю, что это сэкономит некоторые ресурсы.
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)