2013-04-17 1 views
0

установки:Неблокирующий WebSocketHandler при получении задания из очереди

  • Торнадо HTTP/WebSocket сервер. WebSocketHandler реагирует на сообщения от клиента (например, поместить их в задании очереди)
  • A Beanstalk-задания очереди, которая посылает задания к различным компонентам
  • Некоторые другие компоненты обмениваются данными через бобовый стебель, но те не имеют никакого отношения к моей проблеме.

Проблема:

  • WebSocketHandler должен реагировать на рабочих местах, но если он слушает на бобовом стебле, его блокировка. Работа может быть, например, 'отправить данные xy клиенту xyz'

Как это можно решить красиво? Мой первый подход заключался в том, что в отдельном потоке был запущен jobqueue-listener, в котором содержался список маринованного WebSocketHandler. Все должно храниться в redis-db. Поскольку WebsocketHandler не может быть маринован (и этот подход кажется очень уродливым), я ищу другое решение.

Любые идеи?

ответ

1

Вместо того, чтобы пытаться рассортировать экземпляры WebSocketHandler, вы можете хранить их в словаре классов (или просто глобальном).

class MyHandler(WebSocketHandler): 
    connections = {} 

    def __init__(self, *args, **kwargs): 
     self.key = str(self) 
     self.connections[self.key] = self 

Тогда вы бы пройти self.key вместе с заданием на бобовый стебель, и когда вы получите работу обратно вы посмотрите, какое соединение послать вывод с помощью ключа, а затем записать его. Нечто подобное (псевдо-код ...)

def beanstalk_listener(): 
    for response in beanstalk.listen(): 
     MyHandler.connections[response.data[:10]].write_message(response[10:]) 

Я не думаю, что есть какое-либо значение в попытке упорствовать подключения websockethandler в Redis. Они по своей природе эфемерны. Если ваш процесс торнадо перезагружается/умирает, они бесполезны. Если то, что вы пытаетесь сделать, это сохранить запись о том, какой пользователь ждет вывода какого-либо задания, тогда вам нужно будет отслеживать это отдельно.

+0

Спасибо за ваш ответ, он работал так, как я ожидал :-) – Beastcraft

 Смежные вопросы

  • Нет связанных вопросов^_^