关于我在技术社区Slack中谈论的内容的摘要。
请小心,因为它可能包含猜测。
使用或不使用WSGI
的奥秘
在用Python开发Web应用程序时,我通常使用aiohttp Server。
main.py
1 2 3 4 | from aiohttp import web from app import app web.run_app(app) |
我几乎总是创建这样的文件,并且在生产环境中运行它时,我只运行了
但是当我以前用Flask开发Web应用程序时,我使用了一个名为uWSGI的服务器在生产环境中运行它。
那是什么?
为什么在那时而不是这次需要uWSGI?
不,我知道" WSGI是Web应用程序的接口,而uWSGI是其实现之一"。
很久以前,当我用Perl(Amon2)编写Web应用程序时,我使用Plack(PSGI服务器),而当我用Ruby(Sinatra)编写它时,则使用Unicorn(机架服务器)。我过去接触过的语言具有类似的机制。但是它不在Node.js Express中。 1 Node.js与其他语言有什么区别?
总结问题,看起来像这样。
- 为什么Perl Amon2和Ruby Sinatra使用Plack和Unicorn,而Node.js Express不使用?
- 为什么Flask在同一Python Web应用程序框架中使用uWSGI但不使用aiohttp Server?
应用程序本身是否使用HTTP
据我了解,结论是:"因为某些Web应用程序框架说或不说HTTP。"
具体来说:
- 用Amon2实现的应用程序不会使用HTTP(仅支持PSGI)
- 用Sinatra实现的应用程序不会使用HTTP(仅支持Rack)
- 在Express中实现的应用程序会说HTTP 2
- Flask中实现的应用程序不会说HTTP 3(仅支持WSGI)
- 由aiohttp Server实现的应用程序说HTTP 4
不使用HTTP的应用程序无法按原样运行,因此必须与兼容的Web服务器结合使用。 5
那么,为什么框架在
中说或不说HTTP?
似乎是因为" Web服务器和Web应用程序应该分开(Web应用程序本身不必说HTTP)"。
Web服务器需要高速处理大量HTTP请求,并且每个框架要实现服务器来实现它都是昂贵且浪费的。一旦创建了类似WSGI的界面,就可以分离Web服务器和Web应用程序,并以任意组合使用它们。 (考虑到这一点,想法是"无论如何都要说HTTP,请确保可以使用Nginx进行所有操作,包括SSL终止和静态内容分发。"但是我认为Nginx部门就是出于这个想法。 )
如果可以并行处理,则不需要理论
那么为什么Node.js Express和Python aiohttp Server不使用WSGI之类的接口直接说HTTP?
两者有一些共同点,并且都支持带有事件循环的非阻塞IO。
Node.js是运行时本身的事件循环,并且是无阻塞的IO,与框架无关。
Python是一种阻塞的IO语言,因此,直接说HTTP的实现可能根本没有性能,例如,在处理一个请求时,它会阻塞所有其他请求。因此,我们将考虑在线程和事件循环中进行并行处理,但是如果在存在GIL的约束下执行并行处理,则在事件循环中进行处理可能比在线程(?)中进行处理更好。 aiohttp服务器是这种类型的非阻塞IO,因为它依赖于asyncio(事件循环)。
如果应用程序本身可以处理并行处理会怎样?即使您通过简单地讲HTTP来实现它,也可以正常并行处理请求。之后,您可以通过简单地启动多个进程和负载平衡来处理大量请求。因此,您不必使用WSGI将Web服务器与Web应用程序分开。
摘要
- 在Ruby和Python之类的Web应用程序框架中,很难实现并行处理HTTP请求的机制,因此在制定了类似WSGI的接口之后,将其扔给其他机制以分离角色(我认为))
- 最初基于无阻塞IO Node.js Express和Python的asyncio实现的aiohttp Server可以由应用程序本身执行并行处理,因此即使您直接讲HTTP而无需使用类似WSGI的机制也没有问题(我认为是)
我曾经使用过every和pm2进行过程监视,但是这次忽略它们,因为它们是不同的吗?
确切地说,Express应用程序带有标准的Node.js http模块,但是由于它没有定义像WSGI这样的唯一接口,因此可以说它直接说HTTP。这不是夸张的(我认为)?
Flask似乎使用HTTP是因为它具有内置的服务器功能(
aiohttp Server是一个"使用asyncio处理HTTP的模块",而不是" Web应用程序框架",所以如果您必须讲HTTP,这并不奇怪吗?
您是否误解了上面列出的所有框架都可以使用HTTP并支持WSGI等接口?