进入 django 库的代码文件夹,搜索 "import socket"
看到
core/management/commands/runserver.py
import socket
一步步点进去看看
-
runserver.py
-
run()
-
inner_run()
- 打印 Django 启动时的基本信息, “Performing system checks...”, 系统版本之类信息
-
handler = self.get_handler(*args, **options)
, 返回默认的 WSGI handler -> WSGIHandler 对象(core/handlers/wsgi.py) -
run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading, server_cls=self.server_cls)
- server_cls 是 WSGIServer
- 跳转到
basehttp.py
->run()
- 如果多线程:
httpd_cls = type('WSGIServer', (socketserver.ThreadingMixIn, server_cls), {})
- 如果单线程
httpd_cls = server_cls
, 直接 WSGIServer -
httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)
- 最终是传入 addr,handler,创建一个 TCPServer() 对象,
httpd.serve_forever()
- 如果多线程:
-
-
其实就是
- 单线程:
wsgiref/simple_server.py
->class WSGIServer
->TCPServer
->BaseServer
->process_request()
- 多线程:
socketserver.py
->ThreadingMixIn
->process_request()
- 多线程中新开了线程来处理
process_request()
- 多线程中新开了线程来处理
学到的一个用法
httpd_cls = type('WSGIServer', (socketserver.ThreadingMixIn, server_cls), {})
type('String', (), {}')
以 socketserver.ThreadingMixIn
, server_cls
为父类创建一个新的类型, 第一个参数是类名,第二个参数是父类,第三个参数是属性字典
网友评论