7
votes

Capturer l'événement de la déconnexion du client! - gevent / python

J'utilise de long interrogation pour une conversation avec Gevent. J'utilise l'événement.Wait () lorsque vous attendez que de nouveaux messages soient publiés sur le chat.


Je voudrais gérer l'occasion qu'un client déconnecte avec certaines fonctionnalités:

E.g. Retour "Client a déconnecté" en tant que message pour les autres utilisateurs de chat


est-ce possible? =)


0 commentaires

3 Réponses :


1
votes

Ceci est un coup de couteau total dans le noir car je n'ai jamais utilisé Gevent, mais un client déconnectez-vous simplement que lorsque la prise est fermée. Alors peut-être que quelque chose comme ça fonctionnerait:

if not Event.wait():
    # Client has disconnected, do your magic here!
    return Chat({'status': 'client x has disconnected'})


1 commentaires

Vous auriez peut-être frappé un ninja avec ce poignard, laissez-moi vérifier! = D Merci pour ça!



1
votes

Cela dépend du serveur WSGI que vous utilisez. AFAIK GEVENT.WSGI n'empêche pas votre gestionnaire de quelque manière que ce soit lorsque le client ferme la connexion, car libtevent-http ne le fait pas. Cependant, avec Gevent.pywsgi, il devrait être possible. Vous aurez probablement besoin de démarrer une greenlet supplémentaire pour surveiller la condition de prise et aviser en quelque sorte la greenlet qui exécute le gestionnaire, par ex. en le tuant. Je pourrais manquer un moyen plus facile de le faire.


2 commentaires

Merci beaucoup pour votre pensée, je l'apprécie vraiment. C'est quelque chose que j'aimerais vraiment savoir! =) #Gevent sur Freenode semble assez silencieux ces jours-ci ... merci pour votre réponse Denis!


Je me demande, serait-ce une idée terrible d'intensifier une exception dans l'application WSGI asynchrone si un client a déconnecté?



3
votes

Selon le WSGI PEP , si votre application renvoie un itérateur avec Une méthode proche (), le serveur doit appeler cela à la fin de la demande. Voici un exemple: xxx

Cependant, il y a Un bug dans le WSGIREF de Python Mise en œuvre (et dans le serveur DJANGO DEV qui hérite de celui-ci) qui empêche de fermer () d'être appelée sur les déconnectes du client Mid-Stream. Évitez donc Wsgiref et le serveur Django Dev pour ce cas.

Remarque également que fermer () ne sera pas tiré immédiatement lorsque le client déconnecte. Cela se produira lorsque vous essayez d'écrire un message au client et d'échouer car la connexion n'est plus là.


0 commentaires