我试图围绕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()
,则该程序将在每行执行一次后停止。我做错了事,但是文档不是很有帮助。在文档部分implementing servers with gevent中,它说使用
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
然后在它说
The server_forever() method calls start() and then waits until interrupted or until the server is stopped.
之后,我应该如何使用start()
运行服务器,以便它实际上保持 Activity 状态以捕获第一个连接?还:
start()
和serve_forever()
有什么区别? gevent.spawn()
和gevent.joinall()
进行调用,但是在某种程度上如此明显以至于它们已被排除在StreamServer文档之外? 最佳答案
实际上,最好使用gevent 1.0使用gevent.wait()进行阻塞,直到不再有 Activity 的连接/greenlet/监听器/观察者为止。
这是一个示例:https://github.com/gevent/gevent/blob/master/examples/portforwarder.py
关于python - gevent StreamServer.start()似乎没有达到我的期望,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10287629/