Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python gevent.StreamServer和非阻塞原始输入()?_Python_Gevent - Fatal编程技术网

Python gevent.StreamServer和非阻塞原始输入()?

Python gevent.StreamServer和非阻塞原始输入()?,python,gevent,Python,Gevent,出于测试目的,我使用gevent.StreamServer编写了一个简单的tcp服务器。为了向一些客户端发送响应,我需要一种非阻塞方式,通过raw\u input()处理输入,最好不用线程 在谷歌搜索之后,我偶然发现了这个问题: 我写了以下内容,它完全符合我的要求,但我认为有更好的方法。有人能给我指一下正确的方向吗?此外,我们还想知道为什么try/except不能捕获键盘中断 import select from gevent.monkey import patch_all from geven

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

在谷歌搜索之后,我偶然发现了这个问题:

我写了以下内容,它完全符合我的要求,但我认为有更好的方法。有人能给我指一下正确的方向吗?此外,我们还想知道为什么try/except不能捕获键盘中断

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

我发现最简单的方法是使用等待,直到可以读取
sys.stdin

wait_read(sys.stdin.fileno())
return sys.stdin.readline()

我还围绕文件描述符编写了一个小包装器,为它们提供非阻塞的
.read()
.write()
方法:

谢谢,这似乎正是我想要的!在OSX中运行良好,但在Windows中似乎无法正常工作。wait\u read引发“IOError:[Errno 0]No error”,目前gevent没有wait\u read和wait\u write方法