Cloudflare官方
26-01-21 18:02 微博认证:Cloudflare官方微博

Python Workers Redux:快速冷启动、包管理以及以 uv 为核心的开发流程(一)

注意:本帖已更新,提供了关于 AWS Lambda 的更多详情。

在 2024 年,我们宣布了对 Python Workers 的基本支持,让 Python 开发人员能够使用单个命令,将 Python 部署到全球,并且可充分利用 Workers 平台。

从那时起,我们一直在努力,力求让 Workers 上的 Python 体验变得更加出色。我们一直专注于为平台提供套件支援,现在这已成为现实 — 具有极快的冷启动速度和原生 Python 开发体验。

这意味着软件包集成到 Python Worker 的方式发生了变化。我们现在对 Pyodide 支持的任何软件包都提供支持,而不是仅仅提供有限的内置软件包集。Pyodide 是为 Python Workers 提供支持的 WebAssembly 运行时。这包括所有纯 Python 软件包,以及许多依赖动态库的软件包。我们还围绕 uv 构建了工具,来简化软件包安装。

此外,我们还实施了专用内存快照,以缩短冷启动时间。相比其他无服务器 Python 供应商,这些快照能够显著提升速度。在使用常见软件包的冷启动测试中,Cloudflare Workers 的启动速度比 AWS Lambda 快 2.4 倍 (未使用 SnapStart),比 Google Cloud Run 快 3 倍。

在本篇文章中,我们将阐释 Python Workers 的独特之处,并分享我们如何实现上述优势的一些技术细节。首先,对于那些可能不熟悉 Workers 或无服务器平台(特别是具有 Python 背景的开发者)的朋友们,我们先来分享一下您可能想要使用 Workers 的原因。

2 分钟内即可在全球部署 Python

Workers 之所以有魔力,部分原因在于其简洁的代码和便捷的全球部署。首先,我们展示如何通过快速冷启动,在全球各地部署 FastAPI 应用 - 全程不到两分钟。

只需几行代码,就能使用 FastAPI 实施一个简单的 Worker。

图2

要部署类似内容,只需确保已安装 uv 和 npm,然后运行以下命令:
图3

只需使用少量代码和 pywrangler deploy,您就能在 Cloudflare 的边缘网络部署您的应用,并且可扩展到 125 个国家/地区的 330 个位置。无需担心基础设施或扩展。

而且,在许多使用案例中,Python Workers 完全免费。我们的免费计划每天提供 100,000 次请求,每次调用 10 毫秒的 CPU 时间。如需更多信息,请查看文档中的定价详情页面。
有关更多示例,请查看 GitHub 中的存储库。请继续阅读,了解有关 Python Workers 的更多信息。

您可以使用 Python Workers 来做些什么呢?

现在您已经拥有了 Worker,一切皆有可能。代码由您来编写,所以决定权在您。您的 Python Worker 接收 HTTP 请求,并且在公共互联网上,向任何服务器发出请求。

您可以设置 cron 触发器,以便 Worker 定期运行。另外,如果您有更复杂的需求,您可以利用 Python Worker 的工作流,甚至使用 Durable Objects 长时间运行的 WebSocket 服务器和客户端。

以下是使用 Python Workers 可以执行的更多操作示例:
·使用诸如 Jinja 之类的库,在边缘渲染 HTML 模板,同时直接从您的服务器获取动态内容
修改服务器响应。例如,您可以根据请求的内容,动态地将 opengraph 标签注入到 HTML 中。

·使用 Durable Objects 和 WebSockets 构建一个聊天室

·通过 WebSocket 连接使用数据,例如 Bluesky 的 Firehose

·使用 Pillow Python 软件包生成图像

·编写一个小型 Python Worker,用于公开 Python 软件包的 API,然后使用 RPC 通过 JavaScript Worker 来访问

加速软件包冷启动

Workers 这类无服务器平台,仅在必要时运行您的代码,从而为您节省资金。这意味着,如果您的 Worker 没有收到请求,它可能会被关闭,并且需要在收到新请求时重新启动。这通常会产生资源开销,我们将其称为“冷启动”。请务必尽量缩短这些字符串,以最大程度地减少最终用户的延迟。

在标准 Python 中,启动运行时的成本很高,因此我们最初实施的 Python Workers 专注于加快运行时的启动速度。但是,我们很快意识到这还不够。即使 Python 运行时启动迅速,在实际应用中,初始启动通常包括从软件包加载模块;遗憾的是,在 Python 中,许多常用的软件包可能需要几秒钟才能完成加载。

我们的目标是无论是否加载了软件包,都能够快速进行冷启动。

为了测量真实的冷启动性能,我们建立了一个导入常用软件包的基准测试,以及一个使用裸 Python 运行时运行“hello world”的基准测试。Standard Lambda 能够快速启动运行时,但一旦需要导入软件包,冷启动时间就会显著增加。为了对此进行优化,以便在导入软件包的情况下加速冷启动,您可以在 Lambda 上使用 SnapStart(我们很快会将其添加到链接的基准测试中)。这样做会产生存储快照的费用,并且每次恢复时还会产生额外的费用。而 Python Workers 将自动针对每个 Python Worker,免费应用内存快照。

以下是加载三个常见软件包 (httpx、fastapi 和 pydantic) 时的平均冷启动时间:
图4

在此案例中,Cloudflare Python Workers 的冷启动速度比不使用 SnapStart 的 AWS Lambda 快 2.4 倍,比 Google Cloud Run 快 3 倍。我们使用内存快照,实现了较低的冷启动次数,我们将在后面的章节中阐释我们是如何做到这一点的。

我们会定期运行这些基准测试。在此可获取最新数据,以及有关我们测试方法的更多信息。
在架构方面,我们与这些其他平台不同,也就是说,Workers 是基于隔离的。正因如此,我们的目标远大,并且正在规划零冷启动的未来。

与 uv 集成的软件包工具

Python 之所以如此令人惊叹,很大程度上归功于其多样化的软件包生态系统。因此,我们一直在努力,以确保在 Workers 中尽可能简单地使用软件包。

我们认为,使用现有的 Python 工具是获得出色开发体验的最佳途径。因此,我们选择了 uv 软件包和项目管理器,原因是其快速、成熟,并且在 Python 生态系统中发展势头迅猛。

我们围绕 uv 构建了称为 pywrangler 的专属工具。此工具执行以下操作:
·读取 Worker 的 pyproject.toml 文件,以确定其中指定的依赖项。
·将依赖项包含在 Worker 的 python_modules 文件夹中。

Pywrangler 会以与 Python Workers 兼容的方式调用 uv 来安装依赖项,并在本地开发或部署 Workers 时调用 wrangler。

实际上,这意味着您只需要运行 pywrangler dev 和 pywranglerdeploy,即可在本地测试并部署您的 Worker。

Cloudflare 保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序,抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的部署与实施。

从任何设备访问 1.1.1.1,使用我们的免费应用加速和保护您的互联网。

立即联系我们,获取更多相关信息http://t.cn/A6Tx4yTT

#Cloudflare##Python Workers#

发布于 北京