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

Worker脚本中py:ready/py:done事件未触发,请求排查原因

PyScript中带worker属性的脚本不触发py:ready/py:done事件的原因及解决办法

问题本质

这不是文档过时,是你没注意到Worker模式和主线程模式的PyScript生命周期事件不通用:
当给<script type="py">加上worker属性时,Python代码会在独立的Web Worker环境中运行,而py:ready和py:done是绑定在主线程document上的事件,Worker环境中的脚本不会触发这些主线程事件。

解决办法

方式一:使用Worker专属生命周期事件

PyScript为Worker模式提供了专属的py:worker:ready和py:worker:done事件,修改监听代码即可:

<script>
    addEventListener("py:worker:ready", () => {
        const status = document.getElementById("status");
        status.textContent = 'running';
    });
    addEventListener("py:worker:done", () => {
        const status = document.getElementById("status");
        status.textContent = 'done';
    });
</script>

<div id="status">bootstrapping</div>

<script type="py" worker>
    print("Hello 👋")
</script>

方式二:Python主动向主线程发送状态消息

如果需要更灵活的状态控制,可以在Worker的Python代码里通过window.postMessage()向主线程发送消息,主线程监听message事件接收:

<script>
    document.addEventListener("message", (event) => {
        const status = document.getElementById("status");
        switch(event.data) {
            case "worker-ready":
                status.textContent = 'running';
                break;
            case "worker-done":
                status.textContent = 'done';
                break;
        }
    });
</script>

<div id="status">bootstrapping</div>

<script type="py" worker>
    from pyscript import window
    window.postMessage("worker-ready")
    print("Hello 👋")
    window.postMessage("worker-done")
</script>

关键注意点

  • 主线程的py:ready/py:done仅对无worker属性的PyScript脚本生效,这类脚本运行在主线程环境中。
  • Worker模式下的脚本完全隔离于主线程,所有状态同步必须通过Worker专属事件或跨线程消息通信实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:42:14