2011-12-03 53 views
5

Vì vậy, điều tôi đang làm là viết một dịch vụ phát trực tuyến WSGI, sử dụng hàng đợi được bao bọc trong trình lặp để thực hiện đẩy đa hướng. Sau đây là một mô hình đơn giản của dịch vụ:Thực hiện dịch vụ phát trực tuyến WSGI: (cách phát hiện ngắt kết nối máy khách)

# this is managed by another thread 
def processor_runner(): 
    generator = SerialMessageGenerator() 
    for message in generator: 
     for client in Processor.connections: 
      client.put(message) 

# this is managed by twisted's wsgi implementation 
def main(environ, start_response): 
    queue = Queue() 
    Processor.connections.append(queue) 
    status = '200 OK' 
    response_headers = [ 
     ('Content-Type', 'application/json'), 
     ('Transfer-Encoding', 'chunked') 
    ] 
    start_response(status, response_headers) 
    return iter(queue.get, None) 

Và đây là làm việc tuyệt vời với xoắn như máy chủ WSGI (như là một sang một bên, các máy phát điện nối tiếp là một quá trình riêng biệt kết nối với bộ xử lý bởi một hàng đợi quá trình liên) . Câu hỏi của tôi là làm thế nào tôi có thể phát hiện khi một khách hàng ngắt kết nối và do đó loại bỏ nó khỏi hàng đợi? Mặc dù của tôi là thêm hàng đợi như một tuple với socket của khách hàng (socket, queue) và sau đó kiểm tra xem socket có được kết nối trước khi tôi thực hiện việc đặt. Tuy nhiên, tôi không biết chính xác những gì để lấy từ môi trường. Có ai có kinh nghiệm làm điều này ngay trước khi tôi hack thứ gì đó cùng nhau không?

Cập nhật

Dưới đây là giải pháp cuối cùng tôi đã đi với:

class IterableQueue(Queue): 

def __init__(self): 
    Queue.__init__(self) # Queue is an old style class 
    ShellProcessor.connections.append(self) 

def __iter__(self): 
    return iter(self.get, None) 

def close(self): 
    self.put(None) 
    self.task_done() 
    ShellProcessor.connections.remove(self) 
+0

Ngoài ra, cảm thấy tự do để nhận xét về kiến ​​trúc hoặc thực hiện một dịch vụ trực tuyến wsgi nếu bạn có bất kỳ kinh nghiệm. – Bashwork

Trả lời

1

cuộc gọi bị xoắn .close() trên trình lặp nếu có khi yêu cầu kết thúc hoặc bị gián đoạn. Bạn có thể làm một cái gì đó như:

# ... 
start_response(status, response_headers) 
return ResponseIterator(iter(queue.get, None), 
    on_finish=lambda: Processor.connections.remove(queue)) 

nơi ResponseIterator có thể là:

class ResponseIterator: 

    def __init__(self, iterator, on_finish=None): 
     self.iterator = iterator 
     self.on_finish = on_finish 

    def __iter__(self): 
     return self 

    def next(self): 
     return next(self.iterator) 

    def close(self): 
     if self.on_finish is not None: 
     self.on_finish() 
+0

Tốt, tôi không biết nó được gọi là gần trên vòng lặp. Đây là hoàn hảo! – Bashwork

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