Nano Hash - криптовалюты, майнинг, программирование

Захват события отключения клиента! - Гевент/Питон

Я использую длительный опрос для чата с gevent. Я использую Event.wait(), ожидая публикации новых сообщений в чате.


Я хотел бы обработать случай отключения клиента с помощью некоторых функций:

например Вернуть "клиент отключился" в виде сообщения для других пользователей чата


Это возможно? знак равно


Ответы:


1

Это зависит от того, какой сервер WSGI вы используете. AFAIK gevent.wsgi никак не уведомит ваш обработчик, когда клиент закроет соединение, потому что libevent-http этого не делает. Однако с gevent.pywsgi это возможно. Вам, вероятно, потребуется запустить дополнительный гринлет для мониторинга состояния сокета и как-то уведомить гринлет, который запускает обработчик, например. убив его. Хотя я мог упустить более простой способ сделать это.

26.07.2010
  • Большое спасибо за вашу мысль, я действительно ценю это. Это то, что я ДЕЙСТВИТЕЛЬНО хотел бы знать! =) #gevent на freenode в последнее время кажется довольно тихим... Спасибо за ответ, Денис! 27.07.2010
  • Интересно, было бы ужасной идеей асинхронно вызвать какое-то исключение в приложении WSGI, если клиент отключился? 01.08.2010

  • 2

    Согласно WSGI PEP, если ваше приложение возвращает итератор с закрытием( ), сервер должен вызвать его в конце запроса. Вот пример:

    """
    Run this script with 'python sleepy_app.py'.  Then try connecting to the server
    with curl:
    
        curl -N http://localhost:8000/
    
    You should see a counter printed in your terminal, incrementing once every
    second.
    
    Hit Ctrl-C on the curl window to disconnect the client.  Then watch the
    server's output.  If running with a WSGI-compliant server, you should see
    "SLEEPY CONNECTION CLOSE" printed to the terminal.
    """
    
    class SleepyApp(object):
        def __init__(self, environ, start_response):
            self.environ = environ
            self.start_response = start_response
    
        def __iter__(self):
            self.start_response('200 OK', [('Content-type', 'text/plain')])
            # print out one number every 10 seconds.
            import time  # imported late for easier gevent patching
            counter = 0
            while True:
                print "SLEEPY", counter
                yield str(counter) + '\n'
                counter += 1
                time.sleep(1)
    
        def close(self):
            print "SLEEPY CONNECTION CLOSE"
    
    
    def run_gevent():
        from gevent.monkey import patch_all
        patch_all()
        from gevent.pywsgi import WSGIServer
        server = WSGIServer(('0.0.0.0', 8000), SleepyApp)
        print "Server running on port 0.0.0.0:8000. Ctrl+C to quit"
        server.serve_forever()
    
    if __name__ == '__main__':
        run_gevent()
    

    Однако существует ошибка в реализации Python wsgiref (и в сервере разработки Django, который наследуется от нее), которая не позволяет close() от вызова при отключении клиента в середине потока. Так что избегайте wsgiref и сервера разработки Django в этом случае.

    Также обратите внимание, что функция close() не будет запущена сразу после отключения клиента. Это произойдет, когда вы попытаетесь написать какое-то сообщение клиенту и потерпите неудачу, потому что соединения больше нет.

    15.10.2012

    3

    Это полный удар в темноте, поскольку я никогда не использовал gevent, но не будет ли отключение клиента просто при закрытии сокета. Так что, возможно, что-то вроде этого сработает:

    if not Event.wait():
        # Client has disconnected, do your magic here!
        return Chat({'status': 'client x has disconnected'})
    
    26.07.2010
  • ты мог ударить ниндзя этим ударом, дай мне проверить! =D Спасибо за это! 26.07.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..