是什么让 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!

当然,这并不意味着这是网络服务器中的唯一线程。