是什么让WSGI本质上是同步的?

时间:2015-12-05 18:35:04

标签: python asynchronous wsgi synchronous

(如果我弄错了,请纠正我)

WSGI是基于python的Web应用程序的standard interface。但它是 说WSGI本质上是同步的。所以,甚至像Tornado这样的东西 将处理WSGI应用程序synchonously。这意味着,wsgi标准 python web app同步。

我对异步程序如何在内部工作没有很好的理解。 我所知道的是,异步程序在完成任务之前不会等待I/O任务 其他不涉及I/O任务的任务。

如果这是正确的,一个非常基本的python web服务器将处理wsgi app 是这样的:

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应用程序吗?

1 个答案:

答案 0 :(得分:5)

Web服务器和它调用的Python进程之间的接口是同步的 - 因为在WSGI调用进程中阻塞,等待来自后端的响应在它继续之前给它一个响应。无论您的Python代码中发生什么,都可以是同步的,异步的,或者做任何事情 - 但是Web服务器的工作线程会阻塞,直到它得到响应。

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

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