Tornado实现一个消息墙。

Tornado对asynchronous http有很好的支持。 所以跟着demo,总结下一个消息墙要怎么做。

思路: 首先查了下有两种思路,一种是client pull 一种是server push。

这里使用的是server pull,技术就是挺流行的comet技术。

comet大概就是说:我客户端发送一个请求到服务器端,然后服务器端启动一个无线循环,将clinet需要的数据放到response中,并继续刷新,直到整个clinet与server的连接断开。 所以他是一个基于长连接的技术。

1.第一步 就是要做发送新消息的处理,即一个client发送一个消息后,要广播通知到所有的client

 1 class NewMessage(tornado.web.RequestHandler):
 2     #overwrite post method
 3     def post(self):
 4         #define messages to send
 5         message = {
 6              "id": str(uuid.uuid4()),
 7              "body",self.get_argument("body"),
 8         }
 9         message["html"] =  tornado.escape.to_basestring(
10              self.render_string("message.html",message=message))
11         if self.get_argument("next",None):
12             self.redirect(self.get_arugment("next"))
13         else:
14             self.write(message)
15        #global_message_buffer IS a global var
16
17         global_message_buffer.new_message([message])

解释: message[html] 这部分 是将message传入模板,然后返回html代码。

  最关键的是,将这个mesage广播出去。 使用的global_message_buffer.

global_message_buffer = MessageBuffer()

class MessageBuffe():
    self.__init__(self):

        self.waiters = set()
        self.cache = []
        self.cache_size = 10 #define max message cache

    self.new_message(self,message):
           #send message to waiters

            for future in self.waiters:
                future.set_result(message)
            #update waiters to empty
            self.waiters = set()
            #update cache
            self.cache.extend(message)
            #check cache size
            if len(self.cache)>self.cache_size:
                self.cache = self.cache[-self.cache_size:]

回来再写。。

时间: 2024-10-29 11:30:02

Tornado实现一个消息墙。的相关文章

ZeroMQ接口函数之 :zmq_msg_send – 从一个socket发送一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_msg_send zmq_msg_send(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_send – 从一个socket发送一个消息帧 Synopsis int zmq_msg_send (zmq_msg_t *msg, void *socket, int flags); Description zmq_msg_send函数和zmq_sendmsg(3)函数是完全相同的,只是z

ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_recv - 从一个socket中接受一个消息帧 Synopsis int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags); Description zmq_msg_recv()函数和zmq_recvmsg(3)函数是完全相同的,

ZeroMQ接口函数之 :zmq_msg_copy - 把一个消息的内容复制到另一个消息中

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_copy zmq_msg_copy(3)   ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_copy - 把一个消息的内容复制到另一个消息中 Synopsis int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src); Description zmq_msg_copy()函数会将src指定的消息对象中的内容复制到dest指定的消息对象

ZeroMQ接口函数之 :zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_move zmq_msg_move(3)   ØMQ Manual - ØMQ/3.2.5 Name zmq_msg_move - 将一个消息里面的内容移动到另一个消息里面 Synopsis int zmq_msg_move (zmq_msg_t *dest, zmq_msg_t *src); Description zmq_msg_move()函数将会把src参数指定的消息对象里面的内容移动到dest

skynet源码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!_

skynet源代码学习 - 从全局队列中弹出/压入一个消息队列过程

学习云风的skynet源代码,简单记录下. void skynet_globalmq_push(struct message_queue * queue) { struct global_queue *q= Q; uint32_t tail = GP(__sync_fetch_and_add(&q->tail,1)); // only one thread can set the slot (change q->queue[tail] from NULL to queue) if (!

ZeroMQ接口函数之 :zmq_sendmsg – 从一个socket上发送一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-sendmsg zmq_sendmsg(3)        ØMQ Manual - ØMQ/4.1.0 Name zmq_sendmsg – 从一个socket上发送一个消息帧 Synopsis int zmq_sendmsg (void *socket, zmq_msg_t *msg, int flags); Description zmq_sendmsg()函数会把msg参数指定的消息对象添加到socke

zmq_recvmsg – 从一个socket上接收一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-recvmsg zmq_recvmsg(3)         ØMQ Manual - ØMQ/4.1.0 Name zmq_recvmsg – 从一个socket上接收一个消息帧 Synopsis int zmq_recvmsg (void *socket, zmq_msg_t *msg, int flags); Description 函数zmq_recvmsg()会从socket参数指定的socket中接

ZeroMQ接口函数之 :zmq_send – 在一个socket上发送一个消息帧

ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq-send zmq_send(3)              ØMQ Manual - ØMQ/4.1.0 Name zmq_send – 在一个socket上发送一个消息帧 Synopsis int zmq_send (void *socket, void *buf, size_t len, int flags); Description zmq_send()函数会根据buf参数指定的内存缓冲区和len参数指定