2012-04-23 3 views
5

저는 뇌의 개념을 두뇌로 감싸려고 노력하고 있습니다. gevent입니다. 다음은 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()으로 변경하면 각 행을 한 번 실행 한 후 프로그램이 중지됩니다. 내가 잘못된 일을하고 있지만 문서가별로 도움이되지 않습니다. 문서 섹션 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 thanks, updated. –

관련 문제