Как обслуживать каталог с этим кодом?

стандартный пакет Python 2.7, обеспечивающий HTTP-сервер, который выполняет одновременнопотоковый соединения на тот же номер порта.

Привет вам, модераторы, пожалуйста, перестаньте помечать мой вопрос как дубликат вопросов, которые хотят обслуживать не в потоковом режиме, как этот: Многопоточный веб-сервер в Python, Нет, я не хочу такой взлом, какThreadingMixIn это просто собирает ответ и возвращает его как единое целое.

Другими словами, я ищу стандартный способ сделать то, что делает следующая программа-пример, но без написания всего HTTP-сервера сам.

import time, socket, threading

sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 8000

sock.bind((host, port))
sock.listen(1)

# my OWN HTTP server... Oh man, this is bad style.
HTTP = "HTTP/1.1 200 OK\nContent-Type: text/html; charset=UTF-8\n\n"

class Listener(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True # stop Python from biting ctrl-C
        self.start()

    def run(self):
        conn, addr = sock.accept()
        conn.send(HTTP)

        # serve up an infinite stream
        i = 0
        while True:
            conn.send("%i " % i)
            time.sleep(0.1)
            i += 1

[Listener() for i in range(100)]
time.sleep(9e9)

Итак, сначала я попробовал:

# run with this command:
#    gunicorn -k gevent myapp:app
import time

def app(environ, start_response):
    data = b"Hello, World!\n"
    start_response("200 OK", [
        ("Content-Type", "text/plain"),
        ("Content-Length", str(len(data)))
    ])
    for i in range(5):
        time.sleep(1)
        yield "Hello %i\n" % i

# https://stackoverflow.com/questions/22739394/streaming-with-gunicorn

но, к сожалению, это не поток, даже с-k gevent.

Обновление: кажется, что gunicorn пытается сделать keepalive, что потребовало бы Chunked Transfer Coding сlast-chunk немного. Быстрый обзор источников показывает, что он не реализует это. Поэтому мне может понадобиться более изящный HTTP-сервер или более простой (например, мой первый пример выше, основанный наsocket) это не беспокоит keepalive (что довольно глупо для больших потоков).

И тогда я попробовал:

import time
import threading

import BaseHTTPServer

class Handler(BaseHTTPServer.BaseHTTPRequestHandler):

    def do_GET(self):
        if self.path != '/':
            self.send_error(404, "Object not found")
            return
        self.send_response(200)
        self.send_header('Content-type', 'text/html; charset=utf-8')
        self.end_headers()

        # serve up an infinite stream
        i = 0
        while True:
            self.wfile.write("%i " % i)
            time.sleep(0.1)
            i += 1

class Listener(threading.Thread):

    def __init__(self, i):
        threading.Thread.__init__(self)
        self.i = i
        self.daemon = True
        self.start()

    def run(self):
        server_address = ('', 8000+self.i) # How to attach all of them to 8000?
        httpd = BaseHTTPServer.HTTPServer(server_address, Handler)
        httpd.serve_forever()

[Listener(i) for i in range(100)]
time.sleep(9e9)

что довольно хорошо, но немного раздражает, что мне нужно выделить 100 номеров портов. Это потребует отвратительного перенаправления на стороне клиента, чтобы перевести браузер на следующий доступный порт (хорошо, хорошо, я могу скрыть это с помощью JavaScript, но это не так элегантно. Я лучше напишу свой собственный HTTP-сервер, чем сделаю это).

Там должен быть чистый способ просто получить всеBaseHTTPServer прослушиватели на одном порту, так как это такой стандартный способ настройки веб-сервера. Или, может бытьgunicorn или какой-то такой пакет можно сделать так, чтобы он был надежно передан?

Ответы на вопрос(1)

Ваш ответ на вопрос