Использование интеграции gevent-socketio paster приводит к тому, что мое приложение не отвечает

Я пишу приложение Pyramid, которое использует gevent-socketio и redis. Однако я заметил, что когда я выхожу из представления, устанавливающего соединение socket.io, мое приложение перестает отвечать. Чтобы попытаться изолировать проблему, я создал еще одно базовое приложение и обнаружил, что использование pubsub.listen() вызывает проблему:

class TestNamespace(BaseNamespace):

    def initialize(self):
        self.spawn(self.emitter)

    def emitter(self):
        client = redis.pubsub()
        client.subscribe('anything')
        for broadcast in client.listen():
            if broadcast['type'] != 'message':
                continue

Я запускаю свое приложение следующим образом:

pserve --reload development.ini

Однако я могу заставить свое приложение работать, только если использую serve.py из примеры:

import os.path

from socketio.server import SocketIOServer
from pyramid.paster import get_app
from gevent import monkey; monkey.patch_all()

HERE = os.path.abspath(os.path.dirname(__file__))

if __name__ == '__main__':

    app = get_app(os.path.join(HERE, 'development.ini'))
    print 'Listening on port http://0.0.0.0:8080 and on port 10843 (flash policy server)'

    SocketIOServer(('0.0.0.0', 8080), app,
        resource="socket.io", policy_server=True,
        policy_listener=('0.0.0.0', 10843)).serve_forever()

К сожалению, это довольно обременительно для разработки, так как я теряю функциональность --reload. В идеале я хотел бы использовать точку входа для интеграции Paster< /а>

Еще я заметил, что интеграция пастера gevent-sockectio не исправляет gevent, в отличие от примера server.py.

Как заставить pserve --reload работать с gevent-socketio?

Я загрузил тестовое приложение на github: https://github.com/m-martinez/iotest


person mmartinez    schedule 13.11.2013    source источник


Ответы (2)


Под [server:main] в вашем ini-файле.

use = egg:gevent-socketio#paster
transports = websocket, xhr-multipart, xhr-polling
policy_server = True
host = 0.0.0.0
port = 6543

Если вы получаете сообщение об ошибке, убедитесь, что вы используете последнюю версию gevent-socketio.

person Krayons    schedule 14.11.2013
comment
Я использую текущую версию на github вместо версии на pypi. Я попробовал то, что вы предложили (за исключением того, что я использую port = 8080), и это все еще вызывает у меня проблемы. Хотя спасибо, что посмотрели! - person mmartinez; 15.11.2013
comment
Это очень странно. Взгляните на youtube.com/watch?v=zhh_N5pmHBY . Он проходит настройку шаг за шагом. - person Krayons; 15.11.2013

Безуспешно используя egg:gevent-socketio#paster, я в итоге использовал gunicorn с watchdog, чтобы добиться того, что я хотел для разработки:

  watchmedo auto-restart \
            --pattern "*.py;*.ini" \
            --directory ./iotest/ \
            --recursive \
            -- \
            gunicorn --paste ./iotest/development.ini

Вот как выглядит мой раздел [server:main]:

[server:main]
use = egg:gunicorn#main
worker_class = socketio.sgunicorn.GeventSocketIOWorker
host = 0.0.0.0
port = 8080
debug = True
logconfig = %(here)s/development.ini
person mmartinez    schedule 07.04.2014