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