0

我有一个使用 gevent-socketio 运行的烧瓶应用程序,我以这种方式创建:

server = SocketIOServer(('localhost', 2345), app, resource='socket.io')
gevent.spawn(send_queued_messages_loop, server)
server.serve_forever()

send_queued_messages_loop在一个 gevent 线程中启动,该线程不断轮询gevent.Queue我的程序存储数据以将其发送到 socket.io 连接的客户端

我尝试了不同的方法来停止服务器(例如使用sys.exit),无论是从 socket.io 处理程序(当客户端发送 socket.io 消息时)还是从正常路由(当客户端向 发出请求时/shutdown),但无论如何,sys.exit由于greenlets的存在,似乎失败了。

我试图先打电话gevent.shutdown(),但这似乎并没有改变任何东西

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

4

1 回答 1

1

而不是使用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 退出时获得堆栈跟踪。

于 2013-05-05T13:53:24.370 回答