`node:diagnostics_channel`: 可回收的订阅通道,而已死亡的通道的清理程序会删除同名的活动通道
Bun的哪个版本在运行?
1.4.2
你的电脑是什么平台?
Linux x64 (Cloud Run, gVisor)和Linux arm64 (Docker), macOS arm64——全部复制.
- 什么步骤可以复制虫子?
** Bug 1——可收取订阅频道。 ** 在节点中,订阅()'使登记处的微调'强大(IncRef'-ClearWeak'),所以一个订阅的频道只要订阅即可使用。 在Bun中,WeakReference.incRef ()'只增加一个计数器,因此只有持有该物体的人才能使该道保持活性。 如果用户的模块没有保留一个引用(常见的'dc.service(name, fn)' /'dc.channel(name).service(fn)'形状),则下一个GC收集它,"最终化注册"召回删除了地图条目,而以后的"dc.channel(name)"每返回一个没有订阅者的新通道. publish()'然后无人知晓。
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? // bug1. mjs – 运行于: bun bug1. mjs (节点: node -- expose-gc bug1. mjs) . 从“节点:诊断 通道”导入 dc; comst gc = globalThis. (中文(简体) ). Bun? () QQ Bun. gc( 真实) : global This. gc; 接收=0; dc. 订阅("my: channel", () {{收到++;};}; // 没有其它引用频道的内容 等待新的承诺((r) QQ set Timeout(r, 0)); gc (); gc (); (中文(简体) ). 等待新的承诺( (r) QQ set Timeout( r, 50) ); // 让定稿员运行 dc. channel ("我的: channel"). publish ({}; contail.log({有订阅者: dc.has订阅者("my: channel"),收到) ; // Bun 1.4.2:{有订阅者:虚假,收到:0} //节点26:{有订阅者:真实,收到:1}
** Bug 2 — 一个已死频道的定稿器删除其直播后继者。 ** `Weak RefMap ' 最终确定器进行`this.delete(钥匙)'而不检查该条目是否仍指最终确定的对象。 如果一个频道已经死亡,并且在它最终确定器运行之前,以同名创建了一个新的频道,并保持了强烈的坚持,则待定的最终确定器取消了新频道的注册条目. 从那时起,按姓名的检查返回另一个新渠道,而被扣押的、仍然活着和订阅的渠道却无法从姓名上取出。
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
// bug2. mjs (英语).
从“节点:诊断 通道”导入 dc;
comst gc = globalThis. (中文(简体) ). Bun? () QQ Bun. gc( 真实) : global This. gc;
(函数 () { dc. channel ("my: channel" ); } ()); // 创建, 立即无参考
等待新的承诺((r) QQ set Timeout(r, 0));
gc (); gc (); // 收集; 正在定稿
const hold = dc. channel ("my: channel"); // 新鲜频道, 强控
hold. 订阅 (( () ) ;
等待新的承诺(( r) QQ set Timeout( r, 50) ); // 等待定稿运行
contail.log({同个目标: dc. channel ("my: channel") ) QQ 持有,有订阅者: dc. has Sublicers ("my: channel"), hold Has Sublicers: hold. has sublicers });
// Bun 1.4.2 : { 同一对象: 假, 有订阅者: 假, 有持有者: 真}
// 节点 26 : {同一个对象: 真实, 有订阅者: 真实, holdHas订阅者: 真实 }
什么是预期的行为?
两个脚本都应该打印节点 . . . . . . .
内容来源: oven-sh/bun