Я пытаюсь осмыслить концепции, которые использует 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()
, чтобы он действительно оставался в живых, чтобы поймать первое соединение?
Также:
start()
и serve_forever()
?gevent.spawn()
и gevent.joinall()
необходимыми при использовании первого метода, но настолько очевидными, что они были исключены из документации StreamServer -?