gpt4 book ai didi

python - gevent StreamServer.start() 似乎没有达到我的预期

转载 作者:太空狗 更新时间:2023-10-30 00:46:14 26 4
gpt4 key购买 nike

我正在努力思考 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

紧接着它说 server_forever() 方法调用 start() 然后等待直到中断或直到服务器停止。 我应该如何使用 运行服务器start() 以便它实际上保持事件状态以捕获第一个连接?

还有:

  1. start()serve_forever() 有什么区别?
  2. 在什么情况下我应该选择一个而不是另一个?
  3. 在使用第一种方法时是否需要调用 gevent.spawn()gevent.joinall(),但不知何故如此明显以至于它们被排除在外StreamServer 文档?

最佳答案

  1. start() 是一个异步函数,它将服务器置于监听模式。但它不会阻止您的程序退出,这是您的责任。
  2. 在简单的情况下,您可以使用 serve_forever()。当您需要启动多个服务器或除了启动服务器之外还要执行其他操作时,start() 会变得很有用。
  3. 不,gevent.spawn() 和 gevent.joinall() 与服务器无关。

gevent 1.0实际上最好使用 gevent.wait() 阻塞,直到没有更多的事件连接/greenlets/listeners/watchers。

这是一个例子:https://github.com/gevent/gevent/blob/master/examples/portforwarder.py

关于python - gevent StreamServer.start() 似乎没有达到我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com