如何停止运行gevent-socketio的Flask服务器

时间:2013-04-10 17:15:13

标签: python socket.io flask

我有一个使用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(),但这似乎没有改变任何内容

关闭服务器的正确方法是什么?

1 个答案:

答案 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出口上获得堆栈跟踪。