如何使用 WASMTIME 来运行 CPython for WASI,然后利用 Python 实现的 HostFunction 来扩展它?

如何使用 WASMTIME 来运行 CPython for WASI,然后利用 Python 实现的 HostFunction 来扩展它?

💡 原文中文,约11700字,阅读约需28分钟。
📝

内容提要

作者使用 wasmtime 执行编译为 WASM/WASI 字节码的 CPython 虚拟机,并通过 Rust 实现的 Host Function 扩展功能。WASM/WASI 提供跨平台兼容性和安全性,广泛用于浏览器和服务端。尽管面临技术挑战,如缺乏 dlopen 支持和 wasmtime Python 绑定的复杂性,该项目展示了 Python 与 WASI 结合的潜力。

🎯

关键要点

  • 作者使用 wasmtime 执行编译为 WASM/WASI 字节码的 CPython 虚拟机,并通过 Rust 实现的 Host Function 扩展功能。

  • WASM/WASI 提供跨平台兼容性和安全性,广泛用于浏览器和服务端。

  • 项目展示了 Python 与 WASI 结合的潜力,尽管面临技术挑战。

  • WASM 是一种低级编程语言,WASI 是其标准扩展,允许 WASM 程序在浏览器外运行。

  • CPython 的 WASM/WASI 支持由 Brett Cannon 主要完成,演进路线包括从 emscripten 到官方支持。

  • 编译 CPython 为 WASM/WASI 字节码需要设置环境并使用官方提供的 devcontainer。

  • 使用 wasmtime 作为推荐的 WASM/WASI Runtime,作者尝试通过 Host Function 扩展 CPython。

  • 由于缺乏 dlopen 支持,作者需要修改 CPython 的本体部分以支持扩展模块。

  • 通过 Rust 代码实现 Host Function,允许动态修改逻辑。

  • 使用 PyO3 使 Rust 代码能够调用 Python 实现的 Host Function,成功实现了功能扩展。

  • 总结指出了技术路线的 PoC,验证了 Python 和 WASI 结合的可能性,但也暴露出一些问题,如缺乏 dlopen 支持和 Python VM 对象跨线程共享的问题。

🔎

延伸解读

WASM/WASI 的优势与应用场景

WASM/WASI 技术提供了跨平台兼容性和安全性,适用于浏览器和服务端。随着 Serverless 计算和数据库用户自定义函数等场景的兴起,WASM/WASI 的应用正在不断扩展,开发者应关注这些新兴领域的潜力。

技术挑战与解决方案

在将 CPython 编译为 WASM/WASI 字节码的过程中,缺乏 dlopen 支持是一个主要挑战。作者通过修改 CPython 的核心代码来解决这一问题,展示了在技术限制下的创新思维。开发者在类似项目中应考虑这些技术障碍及其解决方案。

Host Function 的实现与扩展

通过 Rust 实现的 Host Function 允许动态修改逻辑,增强了 CPython 的功能。使用 PyO3 进行 Python 代码调用的方式,虽然面临跨线程共享的问题,但为开发者提供了灵活的扩展能力,值得在实际应用中探索。

延伸问答

WASM 和 WASI 的主要功能是什么?

WASM 是一种低级编程语言,允许在现代浏览器中运行,提供接近原生的性能;WASI 是其标准扩展,允许 WASM 程序在浏览器外运行,访问系统资源。

如何将 CPython 编译为 WASM/WASI 字节码?

需要设置环境并使用官方提供的 devcontainer,执行命令 python3 Tools/wasm/wasi.py build -- --config-cache --with-pydebug 来编译。

使用 wasmtime 执行 CPython 时遇到的技术挑战有哪些?

主要挑战包括缺乏 dlopen 支持和 wasmtime Python 绑定的复杂性,这导致需要修改 CPython 的本体部分以支持扩展模块。

如何通过 Rust 实现 Host Function 来扩展 CPython?

通过 Rust 代码实现 Host Function,允许动态修改逻辑,并使用 PyO3 使 Rust 代码能够调用 Python 实现的 Host Function。

Python 与 WASI 结合的潜力是什么?

该项目展示了 Python 与 WASI 结合的潜力,能够在特定场景下如数据 PaaS 中允许用户上传自定义代码。

在将 Python 与 WASI 结合时存在哪些问题?

存在的问题包括缺乏 dlopen 支持和 Python VM 对象跨线程共享的问题,这可能需要新的解决方案来处理。

🏷️

标签

➡️

继续阅读