2017-01-10 2 views
1

Ceci est vraiment gênant pour moi. J'ai un bot de télégramme qui fonctionne avec django et python 2.7. Pendant le développement, j'ai utilisé django sslserver et tout a bien fonctionné. Aujourd'hui, je l'ai déployé en utilisant gunicorn dans nginx et le code fonctionne très différemment de mon localhost. J'ai essayé tout ce que j'ai pu car j'ai déjà commencé à obtenir des utilisateurs, mais en vain. Il me semble que la plupart des objets python perdent leur état après chaque requête et c'est ce qui pourrait causer les problèmes. La bibliothèque que j'utilise a une classe qui gère la conversation avec un utilisateur de télégramme et l'état de la conversation est stocké dans une instance de classe. Parfois, lorsque de nouvelles demandes arrivent, ces valeurs sont déjà perdues. S'il vous plaît a quelqu'un fait face à cela? et y a-t-il un moyen de résoudre le problème rapidement? Je suis dans une situation critique et j'ai besoin d'une solution rapideObjets Python perdent l'état après chaque demande dans nginx

+4

gunicorn utilise le modèle de travailleur prefork. Prefork. Ce qui signifie que vous avez un tas de ** processus indépendants forked-off **. Indépendant, ce qui signifie qu'ils ont leur propre état et ne partagent pas de mémoire les uns avec les autres. Si vous n'avez pas construit votre système pour avoir un moyen de communiquer avec un magasin central (redis, etc.), alors vous devrez retourner à la table à dessin. –

+0

@ Charles Duffy, j'ai une base de données, mais la bibliothèque que j'utilise semble être en train de sauver l'état. De plus, je ne savais pas ça à propos de gunicorn – Ken

+1

Pour le moment, vous pourriez réduire le nombre de travailleurs à 1. Cela nuira à la performance, mais mieux que d'avoir un service qui ne fonctionne pas du tout. –

Répondre

2

Gunicorn a un modèle de préforking travailleur - ce qui signifie qu'il lance plusieurs sous-processus indépendants, dont chacun est chargé de gérer un sous-ensemble de la charge. Si vous comptez que l'état de l'application interne est cohérent pour tous les threads impliqués dans l'offre de votre service, vous devez réduire le nombre de travailleurs à 1, pour vous assurer que tous ces threads sont dans le même processus.


Bien sûr, cela est un pis-aller - si vous voulez être en mesure de faire évoluer votre solution pour exécuter des charges de production, ou plusieurs serveurs sauvegarde de votre application, vous voulez être modifier votre système pour conserver l'état pertinent dans un magasin partagé, plutôt que de compter sur le contenu disponible en cours de processus.