Итак, я пишу потоковую службу WSGI, которая использует очередь, завернутую в итератор, для реализации многоадресной передачи.Ниже приведена упрощенная модель сервиса:
# 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 (кроме того, последовательный генератор - это отдельный процесс, подключенный к процессору через процессочередь).У меня вопрос, как я могу определить, когда клиент отключается, и, таким образом, удалить его из очереди?Хотя я добавляю очередь в виде кортежа с клиентским сокетом, т. Е. (Сокет, очередь), а затем проверяю, подключен ли сокет до того, как я выполню установку.Тем не менее, я не знаю точно, что взять из окружающей среды.Есть ли у кого-нибудь опыт работы с этим до того, как я взломал что-нибудь вместе?
Обновлено
Вот решение, с которым я наконец-то пришел:
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)