我试图在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()
5条答案
按热度按时间z0qdvdin1#
查看Doug Hellmann的博客。
mbzjlibv2#
我开发了一个名为ComplexHTTPServer的PIP实用程序,它是SimpleHTTPServer的多线程版本。
要安装它,您需要做的就是:
使用它非常简单:
(By默认端口为8000。)
kmbjn2e33#
在python3中,你可以使用下面的代码(https或http):
你会发现这段代码将创建一个新的线程来处理每个请求。
使用以下命令生成自签名证书:
如果你使用的是Flask,this blog很不错。
vbkedwbf4#
如果将来可能需要流,那么
ThreadingMixIn
和gunicorn就不好了,因为它们只是收集响应并将其作为一个单元写在最后(如果您的流是无限的,则实际上什么也不做)。您将
BaseHTTPServer
与线程结合使用的基本方法很好。但是默认的BaseHTTPServer
设置会在每个监听器上重新绑定一个新的套接字,如果所有监听器都在同一个端口上,这在Linux中将无法工作。在调用serve_forever()
之前更改这些设置。(就像你必须在线程上设置self.daemon = True
来阻止ctrl-C被禁用一样。下面的示例在同一端口上启动100个处理程序线程,每个处理程序都通过
BaseHTTPServer
启动。r6l8ljro5#
python3.7中的多线程https服务器
您可以在浏览器中测试它:https://localhost:8080运行结果为:enter image description here
enter image description here提醒您可以生成自己的密钥文件和证书使用
要了解有关使用openssl创建自签名证书的详细信息:https://www.devdungeon.com/content/creating-self-signed-ssl-certificates-openssl