2012-04-23 22 views
5

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:

  1. sự khác biệt giữa start()serve_forever() là gì?
  2. Trong bối cảnh nào tôi nên chọn cái khác?
  3. Các cuộc gọi đến gevent.spawn()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?

Trả lời

9
  1. start() là một chức năng không đồng bộ mà đặt một máy chủ trong một chế độ nghe. Nó không ngăn cản chương trình của bạn thoát khỏi mặc dù, đó là trách nhiệm của bạn.
  2. trong những trường hợp đơn giản, bạn có thể sử dụng serve_forever(). start() trở nên hữu ích khi bạn cần khởi động nhiều máy chủ hoặc làm điều gì khác ngoài việc bắt đầu một máy chủ.
  3. không, gevent.spawn() và gevent.joinall() không liên quan gì đến máy chủ.

Với gevent 1.0 thực sự tốt nhất nên sử dụng gevent.wait() chặn cho đến khi không có kết nối/trình phát/người theo dõi/hoạt động tích cực hơn.

Dưới đây là ví dụ: https://github.com/gevent/gevent/blob/master/examples/portforwarder.py

+0

Cảm ơn bạn, điều này đã xóa nó. Cảm ơn bạn đã viết gevent :) – msvalkon

+0

fyi liên kết này có vẻ như đã chết – scape

+0

@scape cảm ơn, đã cập nhật. –

Các vấn đề liên quan