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. Хотя, основываясь на вашем примере, это может быть излишним. Что-то, чтобы сохранить в наборе инструментов.

Другие вопросы по тегам