Tôi đang cố gắng để bọc não của tôi xung quanh các khái niệm mà gevent sử dụng. Đây là một ví dụ từ kho lưu trữ mã gevent. Đó là một máy chủ echo đơn giản.gevent StreamServer.start() dường như không làm những gì tôi mong đợi
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()
Điều đó có vẻ khá đơn giản và tôi hoạt động. Tuy nhiên như đã nói trong nhận xét rằng serve_forever()
là một chức năng chặn. Nếu tôi thay đổi dòng cuối cùng thành server.start()
, chương trình sẽ dừng sau khi thực hiện từng dòng một lần. Tôi đang làm điều gì sai trái nhưng tài liệu không hữu ích lắm.
Trong phần tài liệu implementing servers with gevent, nó nói rằng việc sử dụng start()
nên đẻ trứng một greenlet mới cho mỗi kết nối mới khi sử dụng đoạn mã sau:
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
Và rồi ngay sau khi nó nói rằng The server_forever() method calls start() and then waits until interrupted or until the server is stopped.
Làm sao tôi phải chạy máy chủ bằng cách sử dụng start()
để nó thực sự vẫn còn sống để nắm bắt kết nối đầu tiên?
Ngoài ra:
- sự khác biệt giữa
start()
vàserve_forever()
là gì? - Trong bối cảnh nào tôi nên chọn cái khác?
- Các cuộc gọi đến
gevent.spawn()
vàgevent.joinall()
cần thiết khi sử dụng phương pháp đầu tiên, nhưng bằng cách nào đó rõ ràng là chúng đã bị loại khỏi tài liệu hướng dẫn StreamServer?
Cảm ơn bạn, điều này đã xóa nó. Cảm ơn bạn đã viết gevent :) – msvalkon
fyi liên kết này có vẻ như đã chết – scape
@scape cảm ơn, đã cập nhật. –