python server send event_python – gevent.StreamServer和非阻塞raw_input()...

我用gevent.StreamServer编写了一个简单的tcp服务器用于测试目的.为了让我向一些客户端发送响应,我需要一种非阻塞方式来处理通过raw_input()的输入,最好不使用线程.

我写了以下内容,它完全符合我的要求,但我认为有更好的方法.有人能指出我正确的方向吗?此外,理解为什么try / except没有捕获KeyboardInterrupt.

import select

from gevent.monkey import patch_all

from gevent.server import StreamServer

patch_all(os=True, select=True)

def raw_input(message):

""" Non-blocking input from stdin. """

sys.stdout.write(message)

select.select([sys.stdin], [], [])

return sys.stdin.readline()

def main():

""" Run the server, listen for commands """

server = StreamServer(("0.0.0.0", 6000), handle)

print "Starting server"

gevent.signal(signal.SIGTERM, server.close)

gevent.signal(signal.SIGQUIT, server.close)

gevent.signal(signal.SIGINT, server.close)

server.start()

while True:

try:

a = raw_input("")

if a:

print "Received %s" % a

gevent.sleep(0)

except KeyboardInterrupt:

print "Received a shutdown signal, going down ..."

server.stop()

sys.exit(0)

if __name__ == "__main__":

main()

编辑:我已经重写了部分代码,现在我理解了main()函数的愚蠢.我会发布它作为编辑,万一有人偶然发现这个问题,并对如何做到更好.

from gevent.signal import signal

def get_console_input():

""" Non-blocking console input to the server """

select.select([sys.stdin], [], [])

# There's quite a bit of code here but it is input handling so

# for shortness's sake I've snipped everything and return the line read.

return sys.stdin.readline()

def exit(server):

""" Quit the server gracefully """

print "Received shutdown signal, going down. """

server.close()

sys.exit(0)

def main():

""" The main function. Create and run the server, listen for commands and

append any command to the server so it can send them on to the clients """

# Myserver is a class which inherits from gevent.server.StreamServer.

# Myserver could just as well be replaced by gevent.server.StreamServer.

server = MyServer(("0.0.0.0", PORT))

print "Starting server"

# Add some signal handlers to quit the server gracefully.

gevent.signal(signal.SIGTERM, exit, server)

gevent.signal(signal.SIGQUIT, exit, server)

gevent.signal(signal.SIGINT, exit, server)

# Server started in async mode

server.start()

while True:

get_console_input()

gevent.sleep(0)

if __name__ == "__main__":

main()

你可能感兴趣的:(python,server,send,event)