私は脳が、geventのコンセプトの周りを包んでいます。次に、ジエントコードリポジトリの例を示します。それは単純なエコーサーバーです。gevent StreamServer.start()が期待したように見えない
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()
に変更すると、各行を1回実行した後にプログラムが停止します。私は何か間違っていますが、ドキュメンテーションはあまり役に立ちません。ドキュメントのセクション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()
を使用してサーバーを実行して、実際に最初の接続をキャッチするようにしてください。また
:
start()
とserve_forever()
の違いは何ですか?- 私はどちらのコンテキストを選択する必要がありますか?
- 最初のメソッドを使用するときには
gevent.spawn()
とgevent.joinall()
の呼び出しが必要ですが、StreamServer-ドキュメントから除外されていることは何とか分かりますか?
ありがとうございました、これはそれをクリア。 geventを書いていただきありがとうございます。 – msvalkon
fyiこのリンクは死んでいるようです。 – scape
@scapeありがとうございました。 –