是什么让 WSGI 本质上是同步的?
What makes WSGI is synchronous in nature?
(如有错误请指正)
WSGI 是基于 python 的 standard interface 网络应用程序。但它是
说WSGI本质上是同步的。所以,即使是 Tornado
将处理 WSGI 应用 synchonously。这意味着,wsgi 标准使得
python Web 应用同步。
我不太了解异步程序的内部工作原理。
我所知道的是,异步程序不会等待 I/O
任务直到它完成
不涉及 I/O
任务的其他任务。
如果这是正确的,一个非常基本的 python 处理 wsgi 应用程序的网络服务器将
是这样的:
import socket
class Server(object):
def __init__(self, host, port, app):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((host, port))
self.socket.listen(5)
self.app = app
def serve(self):
while True:
client, addr = self.socket.accept()
request = client.recv()
response_body = self.handle_app(request)
client.sendall(response_body)
client.close()
def handle_app(self, request):
# processing request stuff
environ = self.environ_logic() # some logics
start_response = self.start_response_logic() # some logics
return self.app(environ, start_response)
那么,是什么让 WSGI 在本质上是同步的呢?用那个例子,哪一部分
让它不 async
?并且,是否可以创建一个 Web 服务器(在 python 中)
那个能够异步处理 wsgi 应用程序?
网络服务器和它调用的 Python 进程之间的接口是同步的——因为在 WSGI 调用进程中是阻塞的,在它继续之前等待来自后端的响应。在您的 Python 代码中发生的任何事情都可以是同步的、异步的,或者做任何事情——但是网络服务器的工作线程将阻塞直到它得到响应。
Webserver thread YourCode
| |
| --callout to WSGI code--> |
| |
| [Do stuff ...]
[blocking] [ ... ]
| [Do stuff ...]
| |
| Done!
| <--Your response to the server-- |
Proceed!
当然,这并不意味着这是网络服务器中的唯一线程。
(如有错误请指正)
WSGI 是基于 python 的 standard interface 网络应用程序。但它是
说WSGI本质上是同步的。所以,即使是 Tornado
将处理 WSGI 应用 synchonously。这意味着,wsgi 标准使得
python Web 应用同步。
我不太了解异步程序的内部工作原理。
我所知道的是,异步程序不会等待 I/O
任务直到它完成
不涉及 I/O
任务的其他任务。
如果这是正确的,一个非常基本的 python 处理 wsgi 应用程序的网络服务器将 是这样的:
import socket
class Server(object):
def __init__(self, host, port, app):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((host, port))
self.socket.listen(5)
self.app = app
def serve(self):
while True:
client, addr = self.socket.accept()
request = client.recv()
response_body = self.handle_app(request)
client.sendall(response_body)
client.close()
def handle_app(self, request):
# processing request stuff
environ = self.environ_logic() # some logics
start_response = self.start_response_logic() # some logics
return self.app(environ, start_response)
那么,是什么让 WSGI 在本质上是同步的呢?用那个例子,哪一部分
让它不 async
?并且,是否可以创建一个 Web 服务器(在 python 中)
那个能够异步处理 wsgi 应用程序?
网络服务器和它调用的 Python 进程之间的接口是同步的——因为在 WSGI 调用进程中是阻塞的,在它继续之前等待来自后端的响应。在您的 Python 代码中发生的任何事情都可以是同步的、异步的,或者做任何事情——但是网络服务器的工作线程将阻塞直到它得到响应。
Webserver thread YourCode
| |
| --callout to WSGI code--> |
| |
| [Do stuff ...]
[blocking] [ ... ]
| [Do stuff ...]
| |
| Done!
| <--Your response to the server-- |
Proceed!
当然,这并不意味着这是网络服务器中的唯一线程。