事倍功半是蠢蛋1

一个队列里的数据应该被所有的消费一次。我就想着用链表。
我真蠢,为什么还费劲巴力指针去指着某一个节点 然后每个节点没有指针指向它,
我每个节点都放一个队列 add的时候有几个连接我就放几次就好了啊,瞎寻思,低级错误


from collections import deque
import uuid


SSENodeEventStore = {}


def add_key_value_pair(id):
    SSENodeEventStore[id] = deque()


def delete_key_value_pair(id):
    if id in SSENodeEventStore:
        del SSENodeEventStore[id]


def add_data_to_node_event(value):
    for id in SSENodeEventStore:
        SSENodeEventStore[id].append(value)


def get_and_pop_from_queue(id):
    if id in SSENodeEventStore and SSENodeEventStore[id]:
        return SSENodeEventStore[id].popleft()
    return None

# @access_controller.def_access_target('内核', def_action('节点更新SSE推送', 'POST'))
@route("/", "comfortuni", "gugu", "kernel", "sse")
class KernelSSEPushHandler(BaseHandler):

    def __init__(self, *args, **kwargs):
        super(KernelSSEPushHandler, self).__init__(*args, **kwargs)

    def initialize(self, *args, **kwargs) -> NoReturn:
        super(KernelSSEPushHandler, self).initialize(*args, **kwargs)
        # 关闭自动finish
        self._auto_finish = False

    def set_default_headers(self, *args, **kwargs):
        # 事件驱动模式
        self.set_header('Content-Type', "text/event-stream")
        self.set_header('Content-Control', "no-cache")
        self.set_header('Connection', "keep-alive")
        # 允许跨域
        self.set_header('Access-Control-Allow-Origin', "*")
        self.set_header('Access-Control-Allow-Headers', "Content-Type")
        self.set_header('Access-Control-Allow-Methods', "GET, POST, OPTIONS")
        super(KernelSSEPushHandler, self).set_default_headers(*args, **kwargs)

    async def get(self):
        import random
        client_id = id(self)
        add_key_value_pair(client_id)
        while True:
            add_data_to_node_event(str(random.randint(0, 1000)))
            if self.request.connection.stream.closed():
                delete_key_value_pair(client_id)
                break

            data = get_and_pop_from_queue(client_id)
            if data is None:
                break
            self.write(self.to_json(Message(data=data)))
            try:
                await self.flush()
            except StreamClosedError:
                pass
            await tornado.gen.sleep(2)
posted @ 2024-10-28 16:59  空心橙子  阅读(17)  评论(0)    收藏  举报