Cloudflare 已将 Python Workers 推向正式可用(GA)。这意味着 Python 不再只是该边缘运行时里的实验选项,而是进入了可以被生产团队认真评估的阶段。其底层工作涉及 PEP 783,以及把 Python 期望的 socket 系统调用映射到 Workers 的 connect API。
不过,GA 标签并没有自动回答所有生产问题。此次公告没有给出性能数据;Wasmer 创始人追问了冷启动指标,并引用 Cloudflare 早期文章中约 1.027 秒的数据。与此同时,urllib3 维护者提出了另一个更长期的问题:为兼容 Python 生态而完成的上游工作,未来由谁持续维护?
这不是“把 CPython 塞进一个容器”那么简单
传统 Python 服务通常假设自己运行在 Linux 进程里,可以直接使用文件系统、线程、动态库和 POSIX socket。边缘运行时的约束不同:实例生命周期更短,隔离模型不同,网络访问也往往由平台能力控制。
Python Workers 的关键价值之一,是让 Python 代码及其依赖看到较熟悉的接口,同时由运行时把底层操作转接给 Workers 平台。例如,Python 库可能发起 socket 调用,而实际连接由 Workers 的 connect API 完成。
这种兼容层扩大了可运行的软件范围,但不等于所有 PyPI 包都能无修改运行。评估依赖时,可以把包分成三类:
- 纯 Python 包:通常最容易迁移,但仍可能依赖不受支持的标准库能力。
- 依赖网络 socket 的包:需要验证 DNS、TLS、超时、连接复用和异常语义。
- 带原生扩展的包:需要确认目标运行时是否提供相应构建产物和 ABI 支持。
因此,“支持 Python”不能简单理解为“支持整个现有 Python 服务器生态”。框架能否导入、请求能否成功,只是第一层;资源限制、并发模型和尾延迟才决定它是否适合生产流量。
GA 公告里缺少的关键数字
此次公告没有公布启动时间、请求延迟、吞吐量或包体积对性能的影响。这使得团队暂时无法仅凭公告判断 Python Worker 是否适合延迟敏感接口。
被提及的约 1.027 秒来自更早的 Cloudflare 内容,不能直接当作当前 GA 版本的性能结论。运行时、缓存、部署位置和测量方法都可能已经变化。更稳妥的做法是针对自己的代码进行测试,并至少区分:
- 热实例上的连续请求延迟;
- 间隔一段时间后的首个请求;
- 不同地区发起请求时的 TTFB;
- 引入大型依赖前后的差异;
- 中位数、P95 与 P99,而不只是平均值。
边缘平台中的“冷启动”通常也不能仅凭客户端的一次慢请求确认。DNS、TLS 握手、网络路由、上游服务和平台调度都可能增加时间。平台若没有提供实例状态或冷启动标记,外部测试只能测到端到端结果。
可以这样建立一个最小验证项目
下面是一个可用于验证部署链路的最小示例。这里假设项目使用当前 Workers Python 入口模型;创建项目时应优先采用 Wrangler 生成的 Python 模板,并根据生成文件确认类名、模块名和兼容日期,而不是机械复制旧配置。
# src/entry.py
from workers import Response, WorkerEntrypoint
class Default(WorkerEntrypoint):
async def fetch(self, request):
return Response(
"hello from python worker\n",
headers={"content-type": "text/plain; charset=utf-8"},
)
一个简化的 Wrangler 配置可以这样写;运行前需要把兼容日期调整为项目实际采用的日期:
# wrangler.toml
name = "python-worker-check"
main = "src/entry.py"
compatibility_date = "2025-01-01"
compatibility_flags = ["python_workers"]
在已经安装 Node.js 的环境中,可以使用 Wrangler 本地启动并部署:
npx wrangler dev
npx wrangler deploy
如果当前模板已经不再要求 python_workers 标志,应以 Wrangler 生成的配置和平台文档为准。这个示例的目的不是证明某个业务依赖可用,而是先确认最短请求路径、部署配置和基础响应正常。
接下来可以对部署地址测量 TTFB。把 URL 改为自己的 Worker 地址:
#!/usr/bin/env bash
set -euo pipefail
URL="https://python-worker-check.example.workers.dev"
for i in $(seq 1 20); do
curl --silent --output /dev/null \
--header 'Cache-Control: no-cache' \
--write-out "run=${i} status=%{http_code} connect=%{time_connect}s ttfb=%{time_starttransfer}s total=%{time_total}s\n" \
"${URL}?probe=${i}"
sleep 1
done
这组数据适合发现明显的长尾或首请求异常,但不能单独证明发生了冷启动。为了提高可信度,可以从多个地区执行测试、延长请求间隔,并把原始数据保存下来比较 P50、P95 和 P99。
若要自动汇总结果,可以使用下面这个仅依赖 Python 标准库的脚本。运行前设置 WORKER_URL:
import os
import statistics
import time
import urllib.request
url = os.environ["WORKER_URL"]
samples = []
for index in range(20):
started = time.perf_counter()
request = urllib.request.Request(
f"{url}?probe={index}",
headers={"Cache-Control": "no-cache"},
)
with urllib.request.urlopen(request, timeout=10) as response:
response.read()
if response.status != 200:
raise RuntimeError(f"unexpected status: {response.status}")
elapsed_ms = (time.perf_counter() - started) * 1000
samples.append(elapsed_ms)
print(f"run={index + 1:02d} total={elapsed_ms:.1f}ms")
time.sleep(1)
ordered = sorted(samples)
p95_index = max(0, int(len(ordered) * 0.95) - 1)
print(f"median={statistics.median(samples):.1f}ms")
print(f"p95={ordered[p95_index]:.1f}ms")
print(f"max={max(samples):.1f}ms")
WORKER_URL="https://python-worker-check.example.workers.dev" python benchmark.py
上游维护不是附带问题
urllib3 维护者提出的疑问值得单独看待。为了让常见 Python 网络库在受限运行时中工作,平台团队可能需要修改 CPython、标准库、构建系统或第三方包。补丁被上游接受并不意味着后续维护成本消失。
长期维护至少涉及这些问题:
- 新版 CPython 是否继续通过相关平台测试;
- socket 行为与普通操作系统之间的差异由谁记录和修复;
- urllib3 等库升级后,兼容补丁是否仍然有效;
- 安全漏洞出现时,运行时和预编译依赖能多快更新;
- 平台专用实现是否有公开测试、负责人和发布节奏。
对于用户而言,这直接影响升级风险。如果兼容工作依赖少数贡献者或临时分支,那么一次 Python 大版本升级就可能让关键依赖失效。GA 产品除了稳定 API,也需要可观察的上游协作和维护承诺。
采用前应完成的检查
Python Workers 已经从“能否实现”进入“是否适合具体工作负载”的阶段。比较稳妥的采用路径是从无状态、依赖较少、可降级的边缘逻辑开始,而不是立即迁移大型 Python Web 服务。
上线前可以检查以下项目:
- 锁定 Python、依赖包、Wrangler 和兼容日期;
- 对每个第三方包执行导入测试和真实请求测试;
- 单独测量热请求、疑似冷请求以及 P95/P99 延迟;
- 验证 DNS、TLS、连接超时和异常处理是否符合预期;
- 确认日志、指标和错误追踪可以覆盖运行时故障;
- 保留回退路径,不把关键业务一次性绑定到尚未验证的兼容层;
- 持续关注 CPython、urllib3 等上游项目中的维护状态。
GA 是一个重要里程碑,但它首先代表产品承诺和可用性阶段的变化,不等于每种 Python 工作负载都已经获得可预测的性能。真正决定采用与否的,将是可重复的冷启动数据、真实依赖兼容性,以及平台对上游维护责任的持续投入。