程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

gevent StreamServer.start()似乎没有达到我的期望

发布于2019-11-07 22:57     阅读(1134)     评论(0)     点赞(19)     收藏(4)


我正在尝试将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()以下代码时,using 应该为每个新连接生成一个新的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()以便它实际上保持活动状态以捕获第一个连接?

也:

  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()阻止它,直到没有更多活动的连接/ greenlet / listeners / watchers。

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



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/148759/735b9f7c132cc0e8109a/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)