You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GJS Soup Server示例在CJS中运行2秒后停止监听问题咨询

为什么GJS HTTP服务器变量改为全局后才能持续运行?

核心原因:JavaScript垃圾回收与GLib对象生命周期的联动

  • 当server作为main函数的局部变量时,函数执行完成后,该变量会脱离当前作用域,不再被任何代码引用。GJS/CJS环境的垃圾回收器会自动清理无引用的对象,而GLib的HttpServer这类网络对象,一旦被回收就会触发自身的销毁逻辑——关闭监听端口并释放所有相关资源,这就是你看到ss -tunl中1080端口2秒后消失的原因。
  • 改为全局变量后,server始终处于顶层作用域的引用中,垃圾回收器不会将其标记为可回收对象,因此服务器能持续保持监听状态,主循环也能正常处理请求。

和GLib MainLoop的关联

GLib主循环本身不会持有server对象的引用,它仅负责处理事件循环中的IO事件、定时器等任务。对象的生命周期完全由JavaScript的引用关系决定:只要对象没有被任何变量引用,哪怕它绑定了主循环的事件回调,也会被垃圾回收器清理,进而触发GLib对象的销毁流程,导致服务器端口关闭。而主循环本身因为没有被终止信号触发,所以会继续运行。

内容的提问来源于stack exchange,提问作者Schmaehgrunza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:43:17