Я пишу приложение 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 а>