1. gasoid.ya.ru

    12.01.2012

    0 ↑
    0 ↓
    Есть пример чата на tornado, но там пример для чата с одной комнатой. Есть механизмы которые позволяют передавать данные между потоками для создания чата тет-а-тет? или мож есть очереди именованные?
  2. Grigory Fateyev

    12.01.2012

    1 ↑
    0 ↓

    Там просто, переписываете ChatMixin класс собирать словарь списков ({room_id: [user_1, ...], ...}) и отсылайте сообщение только нужным юзерам. Небольшой пример:

    class PostMixin(object):
    waiters = {}
    cache = []
    cache_size = 200
    
    def online_updates(self, event_id):
        cls = PostMixin
        if not cls.waiters.get(event_id):
            cls.waiters[event_id] = []
        users = memcache_counter(event_id, len(cls.waiters[event_id]))
        return users
    
    def wait_for_messages(self, callback, event_id, cursor=None):
        cls = PostMixin
        if cursor:
            index = 0
            for i in xrange(len(cls.cache)):
                index = len(cls.cache) - i - 1
                if str(cls.cache[index]["id"]) == str(cursor): break
            recent =  cls.cache[index + 1:]
            if recent:
                callback(recent)
                return
        if not cls.waiters.get(event_id):
            cls.waiters[event_id] = []
        cls.waiters[event_id].append(callback)
        memcache_counter(event_id, len(cls.waiters[event_id]))
    
    def new_messages(self, messages, event_id):
        cls = PostMixin
        if cls.waiters.get(event_id) and len(cls.waiters[event_id]) > 0:
            logging.info("Sending new message from event ID <%s> to %r listeners", event_id, len(cls.waiters[event_id]))
            for callback in cls.waiters[event_id]:
                try: 
                    callback(messages)
                except:
                    logging.error("Error in waiter callback", exc_info=True)
        self.waiters[event_id] = []
        cls.cache.extend(messages)
        if len(cls.cache) > self.cache_size:
            cls.cache = cls.cache[-self.cache_size:]
    

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.