Python gevent StreamServer.start()似乎没有达到我预期的效果

Python gevent StreamServer.start()似乎没有达到我预期的效果,python,networking,concurrency,gevent,Python,Networking,Concurrency,Gevent,我正试着让我的大脑围绕着使用的概念。下面是gevent代码库中的一个示例。这是一个简单的回声服务器 from gevent.server import StreamServer # this handler will be run for each incoming connection in a dedicated greenlet def echo(socket, address): print ('New connection from %s:%s' % address)

我正试着让我的大脑围绕着使用的概念。下面是gevent代码库中的一个示例。这是一个简单的回声服务器

from gevent.server import StreamServer

# this handler will be run for each incoming connection in a dedicated greenlet
def echo(socket, address):
    print ('New connection from %s:%s' % address)
    socket.sendall('Welcome to the echo server! Type quit to exit.\r\n')
    # using a makefile because we want to use readline()
    fileobj = socket.makefile()
    while True:
        line = fileobj.readline()
        if not line:
            print ("client disconnected")
            break
        if line.strip().lower() == 'quit':
            print ("client quit")
            break
        fileobj.write(line)
        fileobj.flush()
        print ("echoed %r" % line)


if __name__ == '__main__':
    # to make the server use SSL, pass certfile and keyfile arguments to the constructor
    server = StreamServer(('0.0.0.0', 6000), echo)
    # to start the server asynchronously, use its start() method;
    # we use blocking serve_forever() here because we have no other jobs
    print ('Starting echo server on port 6000')
    server.serve_forever()
这似乎很简单,我相信它是有效的。然而,正如它在评论中所说的那样,
永远服务()
是一个阻塞函数。如果我将最后一行更改为
server.start()
,程序将在每行执行一次后停止。我做错了什么,但是文档不是很有用

在文档部分,它指出使用
start()
应该在使用以下代码时为每个新连接生成一个新的greenlet:

 def handle(socket, address):
     print 'new connection!'

 server = StreamServer(('127.0.0.1', 1234), handle) # creates a new server
 server.start() # start accepting new connections
然后就在它说
之后,server\u forever()方法调用start(),然后等待直到中断或服务器停止。
我应该如何使用
start()
运行服务器,以便它实际上保持活动状态以捕获第一个连接

此外:

  • start()
    永远服务()
    之间有什么区别
  • 在什么情况下,我应该选择一个而不是另一个
  • 当使用第一个方法时,调用
    gevent.spawn()
    gevent.joinall()
    是否是必需的,但却因为太明显而被StreamServer文档遗漏了
  • start()是一个异步函数,用于将服务器置于侦听模式。但这并不能阻止您的程序退出,这是您的责任
  • 在简单的情况下,您可以使用serve_forever()。当您需要启动多台服务器或除启动服务器外还需要执行其他操作时,start()非常有用
  • 不,gevent.spawn()和gevent.joinall()与服务器无关
  • 实际上,最好使用gevent.wait(),它会一直阻止,直到没有更多的活动连接/greenlet/listeners/watchers


    这里有一个例子:

    gevent 1.0很快会对pip有用吗?我不希望手动构建它,现在的gevent.run()称为gevent.wait()。