저는 뇌의 개념을 두뇌로 감싸려고 노력하고 있습니다. 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()
을 사용하여 서버를 실행하여 실제로 첫 연결을 포착 할 수 있습니까? 또한
:
start()
와serve_forever()
의 차이점은 무엇입니까?- 어떤 컨텍스트에서 다른 컨텍스트 중 하나를 선택해야합니까?
- 첫 번째 방법을 사용할 때
gevent.spawn()
및gevent.joinall()
을 호출해야하지만 StreamServer- 설명서에서 제외되었다는 것이 확실합니다.
감사합니다. gevent 작성해 주셔서 감사합니다. – msvalkon
fyi이 링크가 죽은 것처럼 보입니다. – scape
@scape thanks, updated. –