使用Pyodide和WebAssembly将Python引入Workers
内容提要
Cloudflare宣布在其Workers运行时中支持Python。Python Workers可以导入流行的Python包,无需额外的构建步骤或外部工具链。Python执行环境由Pyodide提供,它是将CPython移植到WebAssembly的一个版本。Pyodide支持动态链接,可以在Workers之间共享运行时代码。Cloudflare还添加了对Python HTTP客户端库和FastAPI框架的支持。他们实施了内存快照以改善冷启动时间,并计划进一步优化性能。使用兼容性日期和标志来管理更新并确保稳定性。Cloudflare旨在提供更多Pythonic的API,并为Python创建一个标准化的无服务器API。
延伸解读
动态链接:共享运行时的关键
Pyodide 支持动态链接,使得多个 Workers 可以共享 WebAssembly 模块,降低资源消耗。Cloudflare 在每台机器上运行数千个 Workers,共享运行时代码对于成本控制至关重要。动态链接是“按需付费”,而静态链接是“预先付费”,后者会导致每个 Worker 都携带自己的运行时副本,增加冷启动时间和内存占用。目前 Pyodide 是少数支持动态链接的 WebAssembly 语言运行时,Cloudflare 希望未来更多语言能支持动态链接。
冷启动优化:内存快照与重用
Pyodide 本身有 6.4MB,加上 Python 包,如果每次冷启动都初始化,会非常慢。Cloudflare 在部署时扫描 Worker 代码中的导入语句,执行它们并拍摄 WebAssembly 线性内存的快照,将快照与 Worker 一起部署。请求到来时,加载快照来引导 Worker,将基本 Python Worker 的冷启动时间降至 1 秒以下。未来计划创建共享快照并预加载到“预热”的隔离池中,进一步降低冷启动时间。
兼容性日期与标志:管理 Python 版本更新
Python 和 Pyodide 都有版本更新,可能包含破坏性变更。Cloudflare 使用兼容性日期和标志来管理更新:新版本 Pyodide 被置于兼容性标志之后,仅在指定日期后启用。每个 Python 版本有 5 年支持窗口,之后安全补丁停止,Worker 会自动前移到下一个最旧的 Python 版本。建议定期更新兼容性日期以保持在支持窗口内。包更新也通过类似机制管理,例如 python_3.17_packages_2025_03_01。
同步 HTTP 请求的挑战与未来
许多 Python HTTP 客户端库是同步的,但 Workers 不支持工作线程或同步 XMLHttpRequest,因此目前无法直接支持同步请求。Pyodide 贡献者正在基于 WebAssembly 的堆栈切换提案(stage 3)开发 run_sync 函数,允许阻塞等待异步操作完成。一旦就绪,将能支持同步请求,扩大兼容的 Python 包范围。目前异步库如 httpx 和 aiohttp 已通过补丁使用 Fetch API 工作。
Q&A
Cloudflare的Python Workers支持哪些流行的Python包?
Cloudflare的Python Workers支持的流行Python包包括FastAPI、Numpy、httpx等。
Pyodide在Cloudflare Workers中有什么作用?
Pyodide为Cloudflare Workers提供Python执行环境,允许直接运行Python代码而无需额外的构建步骤。
如何提高Python Workers的冷启动性能?
通过实施内存快照,Cloudflare可以在部署时预先加载Pyodide和所需的Python包,从而减少冷启动时间。
Python Workers与JavaScript Workers有什么不同?
Python Workers直接集成了Python实现,而JavaScript Workers主要依赖于JavaScript引擎,Python Workers提供了更好的语言支持。
Cloudflare如何管理Python Workers的版本更新?
Cloudflare使用兼容性日期和标志来管理Python Workers的版本更新,确保稳定性和向后兼容性。
Python Workers如何调用JavaScript功能?
Python Workers通过Pyodide的外部函数接口(FFI)可以直接调用JavaScript功能,允许Python代码与JavaScript对象交互。