gevent StreamServer.start ()похоже, не делает то, что я ожидал

Я пытаюсь осмыслить концепции, которые использует 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)
    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()

Это кажется довольно простым, и это работает. Однако, как сказано в комментарии, serve_forever()является блокирующей функцией. Если я изменю последнюю строку на server.start(), программа остановится после выполнения каждой строки один раз. Я делаю что-то не так, но документация не очень полезна.

В разделе документации , реализующем серверы с gevent , говорится, что использование start()должно порождать новый гринлет для каждого нового соединения при использовании следующего кода:

 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

И затем сразу после этого говорится, что The server_forever() method calls start() and then waits until interrupted or until the server is stopped.Как я должен запустить сервер, используя start(), чтобы он действительно оставался в живых, чтобы поймать первое соединение?

Также:

  1. В чем разница между start()и serve_forever()?
  2. В каких контекстах я должен предпочесть одно другому?
  3. Являются ли вызовы gevent.spawn()и gevent.joinall()необходимыми при использовании первого метода, но настолько очевидными, что они были исключены из документации StreamServer -?

5
задан msvalkon 23 April 2012 в 20:17
поделиться