为pyodide提供中断处理。
项目描述
pyodide_interrupts
这是一个允许在Pyodide内部处理中断的包。Pyodide没有抢占式多任务处理。此包可启用在Pyodide中处理键盘中断。
它定义了一个上下文处理程序 check_interrupts(callback, interval)
,该处理程序会在每 interval
条指令后调用 callback
。
简单示例
>>> def callback(): print("check")
... with check_interrupts(callback, 10):
... for i in range(50):
... print(i, end=",")
0,1,check
2,3,4,5,6,check
7,8,9,10,11,check
12,13,14,15,16,check
17,18,19,20,21,check
22,23,24,25,26,check
27,28,29,30,31,check
32,33,34,35,36,check
37,38,39,40,41,check
42,43,44,45,46,check
47,48,49,check
使用草图
在实际使用中,我使用了以下回调
def check_for_interrupt(interrupt_buffer):
def helper():
if interrupt_buffer() == 0:
return
raise KeyboardInterrupt()
return helper
interrupt_buffer
是一个围绕 SharedArrayBuffer
的 JavaScript 包装器。在主线程上
let uuid = uuid();
let interrupt_buffer = new Int32Array(new SharedArrayBuffer(4));
pyodide_worker.postMessage({"cmd" : "execute_python", code, interrupt_buffer, uuid});
let result = await responsePromise(uuid);
// If user cancels, write a nonzero value into our SAB, this will signal pyodide to quit execution of code.
onUserCancel(() => { interrupt_buffer[0] = 2; });
在pyodide工作线程上
self.messages = {};
function handleExecutePython(msg){
// Wrap interrupt buffer in a function that gets its value
// Pyodide Python <==> Javascript bindings don't understand how to get values out of the SAB directly.
msg.interrupt_buffer = function(){
return msg.interrupt_buffer[0];
};
messages[msg.uuid] = msg;
self.pyodide.globals["handle_message"](uuid);
}
然后是pyodide代码
from js import messages, postMessage
def handle_message(uuid):
msg = dict(messages[uuid])
del messages[uuid]
# Here would use msg["cmd"] to look up handling in a dispatch.
interrupt_buffer = msg["interrupt_buffer"]
# check_for_interrupt will raise a KeyboardInterrupt if "onUserCancel" handler is executed on main thread.
with check_interrupts(check_for_interrupt(interrupt_buffer), 10_000):
result = run_code(code)
postMessage({"cmd" : "execute_pyodide_result", "result" : result, "uuid" : uuid })
def run_code(code):
# Parse code into ast, handle errors, get result out, etc here
SharedArrayBuffer
运作的安全要求
我引用了来自 MDN关于SharedArrayBuffer的文档
作为基本要求,您的文档需要在安全上下文中。
对于顶级文档,需要设置两个标题以实现跨源隔离您的站点
Cross-Origin-Opener-Policy的值为same-origin(保护您的源免受攻击者侵害)Cross-Origin-Embedder-Policy的值为require-corp(保护受害者免受您的源侵害)
Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp
要检查跨源隔离是否成功,您可以通过测试window和worker上下文中可用的crossOriginIsolated属性来进行
构建
为了构建本地使用的副本,我建议创建一个虚拟环境,然后在该虚拟环境中使用 pip install .
。为了上传到 PyPI,我们必须构建适用于 manylinux
ABI 的包以确保二进制文件与大多数系统兼容。许多 manylinux 存储库为我们提供了带有合适旧版本 CentOS 的 Docker 镜像,我们可以使用这些镜像来构建这些包。要构建,运行 sudo ./docker_build_wheels.sh
。 注意:第一次运行时,这将下载一个 ~300mb 的 Docker 镜像。请注意,您需要安装 Docker 才能使用此功能。生成的 wheel 文件将位于 dist
目录中,并适合上传到 PyPI。
[0.1.0] (2020-07-25)
项目详情
pyodide-interrupts-0.1.1.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b85bc38b92cd5c35dd1a5192a71495abe4cd57eadccfacbc0421fb44fb6c9e74 |
|
MD5 | 04fa45834292393470841f01913ca30f |
|
BLAKE2b-256 | b1c2918c52e47bf91570d9883a1c761c4d78a59cf4d1d8f8c67c25a4e164ff87 |
pyodide_interrupts-0.1.1-cp39-cp39-manylinux1_x86_64.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d1f10d3be19a743ec8ffa4c74eb61aedea94387b05173fe978ffbac7cc61c122 |
|
MD5 | 729e655e462fae7c6caba63569f9bd6e |
|
BLAKE2b-256 | 84a3ca568ca3c09d84841f0f7bcc527f3568eb63f1596d1ae829dc677ec9f60c |
哈希值 用于 pyodide_interrupts-0.1.1-cp38-cp38-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 33638ea97f3538885ab553a842f37bf38b2e814126da83014e03b638d4414ca4 |
|
MD5 | ef446e33730f1db38e6ec3d444858651 |
|
BLAKE2b-256 | 3167715cc8a3e251553d9eee5880749d4a29cce49a5368d7b7e6971e8aefb39c |
哈希值 用于 pyodide_interrupts-0.1.1-cp37-cp37m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d77d130373cf5aed9633ed21ccdcbc9ba8f86663b89f9152554d9a313ad7c3b1 |
|
MD5 | 8221527136837e2edf822883f5d6df84 |
|
BLAKE2b-256 | 479e097b6c60fc7e319577bb82431bf14720ba36d968839755d207804894e105 |
哈希值 用于 pyodide_interrupts-0.1.1-cp36-cp36m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3705a4f75e044254823f65585032470fd11f15f74ac2a02fe912f897bf8b233a |
|
MD5 | 1c9f46998c4de758dc9591b6f8d1de3b |
|
BLAKE2b-256 | 24fd8166238e98e32bd839e801350ae3613205eefd39e423d02e729bec35c823 |
哈希值 用于 pyodide_interrupts-0.1.1-cp35-cp35m-manylinux1_x86_64.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 455e143635204f5842d6eeefb19088bac4c582ec5bf40925794a5126448e2ed6 |
|
MD5 | 86e10dd3011676fd21eab0dc1e40df92 |
|
BLAKE2b-256 | 6739edee146c3602805261ceaac112bc6bef36e86d5b1aadd02a517137b7129f |