Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的多线程web服务器_Python_Multithreading_Http_Webserver - Fatal编程技术网

python中的多线程web服务器

python中的多线程web服务器,python,multithreading,http,webserver,Python,Multithreading,Http,Webserver,我试图用python创建多线程web服务器,但它一次只响应一个请求,我不知道为什么。你能帮帮我吗 #!/usr/bin/env python2 # -*- coding: utf-8 -*- from SocketServer import ThreadingMixIn from BaseHTTPServer import HTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler from time import sle

我试图用python创建多线程web服务器,但它一次只响应一个请求,我不知道为什么。你能帮帮我吗

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from SocketServer import ThreadingMixIn
from  BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from time import sleep

class ThreadingServer(ThreadingMixIn, HTTPServer):
    pass

class RequestHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        sleep(5)
        response = 'Slept for 5 seconds..'
        self.send_header('Content-length', len(response))
        self.end_headers()
        self.wfile.write(response)

ThreadingServer(('', 8000), RequestHandler).serve_forever()
查看道格·赫尔曼博客上的帖子

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading

class Handler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

if __name__ == '__main__':
    server = ThreadedHTTPServer(('localhost', 8080), Handler)
    print 'Starting server, use <Ctrl-C> to stop'
    server.serve_forever()
从BaseHTTPServer导入HTTPServer,BaseHTTPRequestHandler
从SocketServer导入ThreadingMixIn
导入线程
类处理程序(BaseHTTPRequestHandler):
def do_获得(自我):
自我发送_响应(200)
self.end_头()
message=threading.currentThread().getName()
self.wfile.write(消息)
self.wfile.write('\n')
返回
类ThreadedHTTPServer(ThreadingMixIn,HTTPServer):
“”“在单独的线程中处理请求。”“”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
server=ThreadedHTTPServer(('localhost',8080),处理程序)
打印“正在启动服务器,用于停止”
服务器。永远为您服务()
查看道格·赫尔曼博客上的帖子

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading

class Handler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

if __name__ == '__main__':
    server = ThreadedHTTPServer(('localhost', 8080), Handler)
    print 'Starting server, use <Ctrl-C> to stop'
    server.serve_forever()
从BaseHTTPServer导入HTTPServer,BaseHTTPRequestHandler
从SocketServer导入ThreadingMixIn
导入线程
类处理程序(BaseHTTPRequestHandler):
def do_获得(自我):
自我发送_响应(200)
self.end_头()
message=threading.currentThread().getName()
self.wfile.write(消息)
self.wfile.write('\n')
返回
类ThreadedHTTPServer(ThreadingMixIn,HTTPServer):
“”“在单独的线程中处理请求。”“”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
server=ThreadedHTTPServer(('localhost',8080),处理程序)
打印“正在启动服务器,用于停止”
服务器。永远为您服务()

我开发了一个名为PIP的实用程序,它是SimpleHTTPServer的多线程版本

要安装它,您只需执行以下操作:

pip install ComplexHTTPServer
使用它非常简单:

python -m ComplexHTTPServer [PORT]

(默认情况下,端口为8000。)

我开发了一个名为PIP的实用程序,它是SimpleHTTPServer的多线程版本

要安装它,您只需执行以下操作:

pip install ComplexHTTPServer
使用它非常简单:

python -m ComplexHTTPServer [PORT]

(默认情况下,端口为8000。)

令人惊讶的是,这些中断流媒体的解决方案获得了如此多的选票。如果以后可能需要流式处理,那么
ThreadingMixIn
和gunicorn就不好了,因为它们只是收集响应并在最后将其作为一个单元写入(如果您的流是无限的,这实际上没有任何作用)

BaseHTTPServer
与线程相结合的基本方法很好。但是默认的
BaseHTTPServer
设置会在每个侦听器上重新绑定一个新的套接字,如果所有侦听器都在同一端口上,这在Linux中是不起作用的。在调用
永远服务()
之前更改这些设置。(就像您必须在线程上设置
self.daemon=True
以阻止禁用ctrl-C一样。)

以下示例在同一端口上启动100个处理程序线程,每个处理程序通过
BaseHTTPServer
启动

import time, threading, socket, SocketServer, 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

# Create ONE socket.
addr = ('', 8000)
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(addr)
sock.listen(5)

# Launch 100 listener threads.
class Thread(threading.Thread):
    def __init__(self, i):
        threading.Thread.__init__(self)
        self.i = i
        self.daemon = True
        self.start()
    def run(self):
        httpd = BaseHTTPServer.HTTPServer(addr, Handler, False)

        # Prevent the HTTP server from re-binding every handler.
        # https://stackoverflow.com/questions/46210672/
        httpd.socket = sock
        httpd.server_bind = self.server_close = lambda self: None

        httpd.serve_forever()
[Thread(i) for i in range(100)]
time.sleep(9e9)

令人惊讶的是,这些打破流媒体的解决方案获得了如此多的选票。如果以后可能需要流式处理,那么
ThreadingMixIn
和gunicorn就不好了,因为它们只是收集响应并在最后将其作为一个单元写入(如果您的流是无限的,这实际上没有任何作用)

BaseHTTPServer
与线程相结合的基本方法很好。但是默认的
BaseHTTPServer
设置会在每个侦听器上重新绑定一个新的套接字,如果所有侦听器都在同一端口上,这在Linux中是不起作用的。在调用
永远服务()
之前更改这些设置。(就像您必须在线程上设置
self.daemon=True
以阻止禁用ctrl-C一样。)

以下示例在同一端口上启动100个处理程序线程,每个处理程序通过
BaseHTTPServer
启动

import time, threading, socket, SocketServer, 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

# Create ONE socket.
addr = ('', 8000)
sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(addr)
sock.listen(5)

# Launch 100 listener threads.
class Thread(threading.Thread):
    def __init__(self, i):
        threading.Thread.__init__(self)
        self.i = i
        self.daemon = True
        self.start()
    def run(self):
        httpd = BaseHTTPServer.HTTPServer(addr, Handler, False)

        # Prevent the HTTP server from re-binding every handler.
        # https://stackoverflow.com/questions/46210672/
        httpd.socket = sock
        httpd.server_bind = self.server_close = lambda self: None

        httpd.serve_forever()
[Thread(i) for i in range(100)]
time.sleep(9e9)

在python3中,您可以使用以下代码(https或http):

您将发现,这段代码将创建一个新线程来处理每个请求

以下命令生成自签名证书:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

如果您使用的是Flask,这很好。

在python3中,您可以使用以下代码(https或http):

您将发现,这段代码将创建一个新线程来处理每个请求

以下命令生成自签名证书:

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

如果您使用的是Flask,这很好。

python3.7中的多线程https服务器

from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import threading
import ssl

hostName = "localhost"
serverPort = 8080


class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
        self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
        self.wfile.write(bytes("<p>Thread: %s</p>" % threading.currentThread().getName(), "utf-8"))
        self.wfile.write(bytes("<p>Thread Count: %s</p>" % threading.active_count(), "utf-8"))
        self.wfile.write(bytes("<body>", "utf-8"))
        self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))


class ThreadingSimpleServer(ThreadingMixIn,HTTPServer):
    pass

if __name__ == "__main__":
    webServer = ThreadingSimpleServer((hostName, serverPort), MyServer)
    webServer.socket = ssl.wrap_socket(webServer.socket, keyfile='./privkey.pem',certfile='./certificate.pem', server_side=True)
    print("Server started http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")

要了解有关使用openssl创建自签名证书的详细信息,请执行以下操作:

python3.7中的多线程https服务器

from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import threading
import ssl

hostName = "localhost"
serverPort = 8080


class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>https://pythonbasics.org</title></head>", "utf-8"))
        self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
        self.wfile.write(bytes("<p>Thread: %s</p>" % threading.currentThread().getName(), "utf-8"))
        self.wfile.write(bytes("<p>Thread Count: %s</p>" % threading.active_count(), "utf-8"))
        self.wfile.write(bytes("<body>", "utf-8"))
        self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))


class ThreadingSimpleServer(ThreadingMixIn,HTTPServer):
    pass

if __name__ == "__main__":
    webServer = ThreadingSimpleServer((hostName, serverPort), MyServer)
    webServer.socket = ssl.wrap_socket(webServer.socket, keyfile='./privkey.pem',certfile='./certificate.pem', server_side=True)
    print("Server started http://%s:%s" % (hostName, serverPort))

    try:
        webServer.serve_forever()
    except KeyboardInterrupt:
        pass

    webServer.server_close()
    print("Server stopped.")


要了解有关使用openssl创建自签名证书的详细信息:

使用非阻塞套接字,您可以为数千个客户端提供服务器。无需为每个请求创建线程。@shiplu.mokadd.im您可以发布ans吗?您的帮助将非常有用appreciated@Pilot这里需要两件事<代码>选择()和非阻塞。Python有一个库。IBM使用select()。@shiplu.mokadd获得了一些关于套接字编程的知识。感谢Master提供的有用评论。这是多线程SimpleHTTPServer(如HTTP服务器)的另一个很好的示例。使用非阻塞套接字,您可以为数千个客户端提供服务器。无需为每个请求创建线程。@shiplu.mokadd.im您可以发布ans吗?您的帮助将非常有用appreciated@Pilot这里需要两件事<代码>选择()和非阻塞。Python有一个库。IBM使用select()获得了一些关于套接字编程的知识@shiplu.mokadd感谢Master提供的有用评论这里是多线程SimpleHTTPServer(如HTTP服务器)的另一个很好的示例:。请注意,
ThreadingMixIn
必须位于超类列表中的
HTTPServer
之前,否则它将无法在上运行更详细的示例。这不会流式处理。使用
BaseHTTPServer
的更好方法是:我看不出这个答案中的代码与问题中的代码有什么本质区别。有吗?Python 3.7:不工作,ModuleNotFoundError:没有名为'BaseHTTPServer'的模块请注意,
ThreadingMixIn
必须位于超级las中的
HTTPServer
之前