所以我正在做的是编写一个WSGI流服务,该服务利用包装在迭代器中的Queue来实现多播推送。以下是该服务的简化模型:
# 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)
这与WSGI服务器的扭曲效果很好(顺便提一下,串行生成器是一个由进程间队列连接到处理器的独立进程)。我的问题是如何检测客户端何时断开连接并将其从队列中删除?我虽然是将队列添加为客户端套接字的元组,即(套接字,队列),然后在执行put之前检查套接字是否仍然连接。但是,我不确切地知道从环境中获取什么。在我合作之前,有没有人有过这样做的经验?
更新
这是我最终解决的解决方案:
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 :(得分:1)
扭曲调用.close()
。你可以这样做:
# ...
start_response(status, response_headers)
return ResponseIterator(iter(queue.get, None),
on_finish=lambda: Processor.connections.remove(queue))
ResponseIterator
可以是:
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()
答案 1 :(得分:0)
读:
http://groups.google.com/group/modwsgi/browse_frm/thread/8ebd9aca9d317ac9
有些是mod_wsgi特定的,但通常同样的问题适用于任何WSGI服务器。