Avec et sans WSGI

Un résumé de ce dont je parlais dans une communauté technique, Slack.

Soyez prudent car il contient probablement des spéculations.

Le mystère de l'utilisation ou non de WSGI

J'utilise généralement aiohttp Server lors du développement d'applications Web en Python.

main.py


from aiohttp import web
from app import app

web.run_app(app)

Je crée presque toujours un fichier comme celui-ci, et quand je l'exécute en production, je lance juste python main.py (dans le conteneur Docker). Ce n'est pas difficile, il exécute simplement une application Web.

Cependant, lorsque je développais des applications Web avec Flask auparavant, j'utilisais un serveur appelé uWSGI pour l'exécuter en production.

Qu'est-ce que c'est? Pourquoi aviez-vous besoin d'uWSGI à ce moment-là et pas cette fois?

Non, je sais que "WSGI est l'interface pour les applications Web et uWSGI est l'une de ses implémentations".

Il était une fois, lorsque j'écrivais une application Web en Perl (Amon2), j'utilisais Plack (serveur PSGI), et quand je l'écrivais en Ruby (Sinatra), j'utilisais Unicorn (serveur Rack). Les langues que j'ai touchées dans le passé ont un mécanisme similaire. Mais ce n'était pas dans Node.js + Express. [^ pm2] Quelle est la différence entre Node.js et d'autres langages?

[^ pm2]: J'utilisais pour toujours et pm2 pour la surveillance des processus, mais je les ai ignorés cette fois parce qu'ils sont différents.

Pour résumer les questions, cela ressemble à ceci.

Si l'application elle-même parle HTTP

Autant que je sache, la conclusion est ** "Parce que le framework d'application Web parle ou ne parle pas HTTP" **.

Plus précisément:

[^ express]: Pour être précis, l'application Express est servie avec le module http standard Node.js, mais elle ne définit pas d'interface unique comme WSGI, donc elle dit qu'elle parle directement HTTP. Ce n'est pas une exagération (je pense) [^ flask]: Flask semble parler HTTP parce qu'il a une fonction serveur intégrée (ʻapp.run () `), mais c'est une implémentation de serveur WSGI après tout, et c'est une implémentation simple, donc elle convient à une utilisation en production. Non [^ aiohttp]: Puisque aiohttp Server est un "module qui gère HTTP avec asyncio" plutôt qu'un "framework d'application Web", il est étrange que vous deviez parler HTTP.

Les applications qui ne parlent pas HTTP ne peuvent pas s'exécuter seules et doivent être associées à un serveur Web compatible. [^ a]

[^ a]: J'avais mal compris que tous les frameworks listés ci-dessus étaient capables de parler HTTP et supportaient également des interfaces comme WSGI.

Alors, pourquoi certains frameworks parlent ou ne parlent pas HTTP?

Il semble que c'est parce que "le serveur Web et l'application Web doivent être séparés (l'application Web elle-même n'a pas besoin de parler HTTP)".

Les serveurs Web doivent traiter un grand nombre de requêtes HTTP à grande vitesse, et il est coûteux et coûteux pour chaque framework d'implémenter un serveur pour le réaliser. Une fois que vous avez une interface comme WSGI, vous pouvez séparer le serveur Web et l'application Web et les utiliser dans n'importe quelle combinaison. (En réfléchissant à cela, l'idée est: "Si vous parlez quand même HTTP, assurez-vous que vous pouvez tout faire avec Nginx, y compris la terminaison SSL et la distribution de contenu statique." Mais je pense que l'unité Nginx est née de cette idée. Convaincu)

Théorie inutile si le traitement parallèle est possible

Alors pourquoi Node.js + Express et Python + aiohttp Server parlent-ils HTTP directement sans utiliser une interface comme WSGI?

Les deux ont quelque chose en commun, tous deux prenant en charge les E / S non bloquantes avec des boucles d'événements.

Node.js est un E / S non bloquant quel que soit le framework, car le runtime lui-même est une boucle d'événements.

Python est un langage d'E / S bloquant, donc une implémentation simple parlant HTTP peut entraîner aucune performance du tout, par exemple, lors du traitement d'une requête, elle bloque toutes les autres requêtes. Par conséquent, nous considérerons le traitement parallèle dans les threads et les boucles d'événements, mais si le traitement parallèle est effectué sous la contrainte qu'il y a un GIL, il peut être préférable de le faire dans les boucles d'événements que dans les threads (?). Comme aiohttp Server repose sur asyncio (boucle d'événement), il s'agit d'un IO non bloquant de ce type.

Que se passe-t-il si l'application elle-même peut gérer le traitement parallèle? Même si vous l'implémentez de manière simple, vous pouvez gérer les demandes en parallèle normalement. Après cela, vous pouvez gérer un grand nombre de demandes en démarrant simplement plusieurs processus et en équilibrant la charge. Vous n'avez donc pas besoin d'utiliser WSGI pour séparer votre serveur Web de votre application Web.

Résumé

Recommended Posts

Avec et sans WSGI
Capture d'image / comparaison de la vitesse OpenCV avec et sans GPU
Avec moi, cp et sous-processus
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Travailler avec le tkinter et la souris
Python et matériel - Utilisation de RS232C avec Python -
Super résolution avec SRGAN et ESRGAN
Group_by avec sqlalchemy et sum
python avec pyenv et venv
Avec moi, NER et Flair
Fonctionne avec Python et R
Communiquez avec FX-5204PS avec Python et PyUSB
Visualisation interactive avec ipywidgets et Bokeh
Briller la vie avec Python et OpenCV
Tri avec un mélange de chiffres et de lettres
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
Easy Slackbot avec Docker et Errbot
Défiez LOTO 6 avec Python sans discipline
Segmentation d'image avec scikit-image et scikit-learn
Processus d'authentification avec gRPC et authentification Firebase
Grattage avec Python, Selenium et Chromedriver
Jouez avec la série Poancare et SymPy
HTTPS avec Django et Let's Encrypt
Segmentation et regroupement de photos avec DBSCAN
Imprimez avec python3 sans interruption
Grattage avec Python et belle soupe
Sauvegarde NAS avec php et rsync
Encodage et décodage JSON avec python
Traitement de chemin avec take while et drop while
Authentification de base, authentification Digest avec Flask
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Comparez DCGAN et pix2pix avec Keras
Utilisation de sessions et de réflexions avec SQL Alchemy
Lire et écrire NetCDF avec Python
Introduisez errBot et travaillez avec Slack
Enregistrer et récupérer des fichiers avec Pepper
Async / await avec Kivy et tkinter
J'ai joué avec PyQt5 et Python3
Connectez-vous avec PycURL et recevez une réponse
Expérimenté avec unicode, décoder et encoder
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Dessinez des figures avec OpenCV et PIL
Jeu Sugoroku et jeu d'addition avec Python
Télécharger et télécharger des images avec Falcon
Modulation et démodulation FM avec Python
Créer un environnement avec pyenv et pyenv-virtualenv
Communiquez entre Elixir et Python avec gRPC
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Hello World et détection de visage avec opencv-python 4.2
Surveillance des animaux avec Rekognition et Raspberry pi