我有一个使用gevent-socketio运行的烧瓶应用程序,我用这种方式创建:
server = SocketIOServer(('localhost', 2345), app, resource='socket.io')
gevent.spawn(send_queued_messages_loop, server)
server.serve_forever()
我在gevent线程中启动send_queued_messages_loop
,该线程继续轮询gevent.Queue
我的程序存储数据以将其发送到socket.io连接的客户端
我尝试了不同的方法来阻止服务器(例如使用sys.exit
)从socket.io处理程序(当客户端发送socket.io消息时)或从正常路由(当客户端创建请求/shutdown
)但在任何情况下,由于存在greenlet,sys.exit
似乎都失败了。
我首先尝试拨打gevent.shutdown()
,但这似乎没有改变任何内容
关闭服务器的正确方法是什么?
答案 0 :(得分:0)
而不是使用serve_forever()
创建gevent.event.Event
并等待它。要实际启动关闭,请使用其set()
方法触发事件:
from gevent.event import Event
stopper = Event()
server = SocketIOServer(('localhost', 2345), app, resource='socket.io')
server.start()
gevent.spawn(send_queued_messages_loop)
try:
stopper.wait()
except KeyboardInterrupt:
print
无论您现在想要终止流程,您只需拨打stopper.set()
即可。
try..except
并不是必需的,但我不想在干净的CTRL-C出口上获得堆栈跟踪。