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
相关产品推荐
相关产品推荐

