事倍功半是蠢蛋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)

浙公网安备 33010602011771号