2012-04-23 14 views
5

私は脳が、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()を使用してサーバーを実行して、実際に最初の接続をキャッチするようにしてください。また

  1. start()serve_forever()の違いは何ですか?
  2. 私はどちらのコンテキストを選択する必要がありますか?
  3. 最初のメソッドを使用するときにはgevent.spawn()gevent.joinall()の呼び出しが必要ですが、StreamServer-ドキュメントから除外されていることは何とか分かりますか?

答えて

9
  1. start()は、サーバーをリスニングモードにする非同期関数です。プログラムの終了を妨げるものではありませんが、これはあなたの責任です。
  2. 単純なケースでは、serve_forever()を使用できます。 start()は、複数のサーバーを起動する必要がある場合や、サーバーの起動に加えて何かを行う必要がある場合に便利です。
  3. いいえ、gevent.spawn()およびgevent.joinall()はサーバーとは関係ありません。

gevent 1.0とすると、実際には接続/グリーンレット/リスナー/ウォッチャーがなくなるまでブロックするgevent.wait()を使用することが最も効果的です。ここで

は例です:https://github.com/gevent/gevent/blob/master/examples/portforwarder.py

+0

ありがとうございました、これはそれをクリア。 geventを書いていただきありがとうございます。 – msvalkon

+0

fyiこのリンクは死んでいるようです。 – scape

+0

@scapeありがとうございました。 –

関連する問題