BasicHTTPServer, SimpleHTTPServer и параллелизм
Я пишу небольшой веб-сервер для тестирования с использованием Python, BasicHTTPServer и SimpleHTTPServer. Похоже, он обрабатывает один запрос за раз. Есть ли способ сделать это немного быстрее, не возиться слишком глубоко? В основном мой код выглядит следующим образом, и я бы хотел, чтобы это было так просто;)
os.chdir(webroot)
httpd = BaseHTTPServer.HTTPServer(("", port), SimpleHTTPServer.SimpleHTTPRequestHandler)
print("Serving directory %s on port %i" %(webroot, port) )
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("Server stopped.")
3 ответа
Вы можете создать свой собственный класс потоков или разветвлений с наследованием mixin от SocketServer:
import SocketServer
import BaseHTTPServer
class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
pass
Это имеет свои ограничения, так как не использует пул потоков, ограничено GIT и т. Д., Но может немного помочь (при относительно небольших усилиях). Помните, что запросы будут обрабатываться одновременно несколькими потоками, поэтому обязательно установите правильную блокировку доступа к глобальным / общим данным (если такие данные не изменяются после запуска), выполненные в ходе обработки запроса.
Этот вопрос SO охватывает то же самое основание (не особенно подробно).
Вы также можете взглянуть на CherryPy - он тоже довольно простой и имеет несколько потоков запросов без дополнительных усилий. Хотя ваши потребности сейчас могут быть скромными, CP обладает множеством полезных возможностей, которые могут принести вам пользу в будущем.
В зависимости от ваших требований, другой вариант может заключаться в подключении Paste. Хотя, основываясь на вашем примере, это может быть излишним. Что-то, чтобы сохранить в наборе инструментов.