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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值