msv*_*kon 5 python concurrency networking gevent
我试图围绕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()
Run Code Online (Sandbox Code Playgroud)
这似乎很简单,我的工作.但正如它在评论中所说的那样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
Run Code Online (Sandbox Code Playgroud)
然后就说它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的文档吗?使用gevent 1.0,实际上最好使用gevent.wait()阻塞,直到没有更多活动连接/ greenlets/listeners/watchers.
这是一个例子:https://github.com/gevent/gevent/blob/master/examples/portforwarder.py
| 归档时间: |
|
| 查看次数: |
3128 次 |
| 最近记录: |