当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是什么使WSGI本质上是同步的?》经验,为你挑选了1个好方法。

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

WSGI是基于python的Web应用程序的标准接口。但是据说WSGI本质上是同步的。因此,即使类似的东西也Tornado 可以同步处理WSGI应用程序。这意味着,wsgi标准使python Web应用程序同步。

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

如果正确,那么处理wsgi应用程序的非常基本的python网络服务器将是这样的:

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?并且,是否有可能创建一个能够异步处理wsgi应用程序的网络服务器(使用python)?



1> zxq9..:

网络服务器和它调用的Python进程之间的接口是同步的-就像WSGI调用进程中的阻塞一样,等待后端的响应以在继续之前对其进行响应。Python代码中发生的任何事情都可以是同步的,异步的,也可以执行任何操作-但网络服务器的工作线程将阻塞,直到获得响应为止。

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

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有