2013-04-10 98 views
0

我有GEVENT-socketio运行的烧瓶中的应用程序,创建这样:如何停止的烧瓶服务器上运行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连接的客户端

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

我想先请gevent.shutdown(),但这似乎并没有改变任何东西

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

回答

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