我正在使用 pyodide 库,并且遇到了一个问题,我需要为 stdin 添加一个处理程序,但是我在网络工作人员中运行 pyodide 并且我无权访问
window
或任何类型的 prompt
。
pyodide.setStdin({ stdin: () => {
// code here
}})
我尝试使用
postMessage()
函数向页面请求输入并将其发回,但由于我从函数返回此内容,因此在必须返回之前我无法接收输入。我还尝试使用 SharedArrayBuffer
和 Atomics
来冻结网络工作人员直到页面响应,但我无法找到解决方案,但我认为这是一个很好的起点。到目前为止,我看到的大多数解决方案只是重组代码,但由于 pyodide 是一个外部库,我被迫从我在 pyodide.setStdin
中设置的函数返回
我找到了如何解决这个问题,所以我想我应该发布它。我最终确实将
SharedArrayBuffer
与 Atomics
一起使用。 Andrea Giammarchi 有一篇关于在线程之间传递字符串的精彩文章, 但基本上我会通过 postMessage
将缓冲区传递到主线程,询问字符串的长度,然后使用 Atomics.wait
暂停,直到工作人员收到长度。然后,我将使用它来创建另一个缓冲区并像以前一样传递它,但将字符串编码到缓冲区中并从工作人员中解码它。随附的 Medium 文章比我解释得更好。