什么使得WSGI具有同步性质?

11

如果我犯了错误,请纠正我。

WSGI是Python基于Web应用程序的标准接口。但是据说WSGI的性质是同步的。因此,即使像Tornado这样的东西也会同步地处理WSGI应用程序。这意味着,wsgi标准使python web应用程序同步。

我对异步程序的内部工作原理不是很了解。我知道的是,异步程序不会等待I/O任务完成后再执行不涉及I/O任务的其他任务。

如果我的理解是正确的,那么一个非常基本的处理wsgi应用程序的Python Web服务器将如下所示:

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在本质上是同步的?通过那个例子,哪一部分使它不是异步的?是否有可能创建一个能够异步处理WSGI应用程序的Web服务器(使用Python)?

1个回答

12

Web服务器与调用的Python进程之间的接口是同步的,也就是说WSGI调用过程是阻塞的,在继续之前会等待后端的响应。您的Python代码中发生的任何事情都可以是同步的、异步的或其他操作,但是Web服务器的工作线程将一直阻塞,直到它收到响应为止。

Webserver thread                      YourCode 
    |                                    |
    |       --callout to WSGI code-->    |
    |                                    |
    |                              [Do stuff ...]
[blocking]                         [     ...    ]
    |                              [Do stuff ...]
    |                                    |
    |                                  Done!
    |   <--Your response to the server-- |
 Proceed!

这并不意味着这是 web 服务器中 唯一 的线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接