Python Workers 现已正式发布

Hacker News Top 产品

摘要

Cloudflare 宣布 Python Workers 正式发布,使其成为其 Developer Platform 上的一流语言,并支持 FastAPI、Django 和 Flask 等框架。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/09/21 18:43

# Python Workers现已正式发布 来源:https://blog.cloudflare.com/python-workers-ga/ 两年前,我们推出了Python Workers,为在Cloudflare Workers运行环境中运行Python应用程序(https://blog.cloudflare.com/python-workers/)提供了途径。我们的目标是让使用Python编写Workers与使用TypeScript一样简单,并让Python的包和生态系统能够“开箱即用”。如今,Python Workers已正式发布(GA)。 GA意味着什么?这意味着Python现已成为Cloudflare开发者平台上的首类、完全支持的语言。您可以带来熟悉的Python代码、库和设计模式,并将其与Workers AI、R2、D1、Hyperdrive、持久对象、队列、工作流以及Cloudflare平台的其余部分无缝连接。您还可以在Python Workers内运行流行的Python框架,如FastAPI、Django和Flask。甚至可以使用动态Workers(https://blog.cloudflare.com/dynamic-workers/)在另一个Worker内部创建Python Worker。 ```python from fastapi import FastAPI, Request from workers import asgi, WorkerEntrypoint app = FastAPI() @app.get("/") async def root(request: Request): env = request.scope["env"] return await env.AI.run( "@cf/openai/gpt-oss-120b", { "instructions": "You are a friendly assistant.", "input": "What is the origin of the phrase Hello, World?", }, ) Default = asgi.entrypoint(app) ``` ## Python Workers背后的发展历程 将Python引入Cloudflare Workers是一个自然的选择。由于Workers自2018年起支持WebAssembly(https://blog.cloudflare.com/webassembly-on-cloudflare-workers/),这为我们提供了一个完美的环境来运行Wasm编译的Python解释器。通过使用Pyodide(https://pyodide.org/en/stable/),我们能够快速在Cloudflare Workers中支持广泛的Python应用程序。我们的目标是创建一个首个支持无限扩展Python应用程序的平台,同时使其开发体验与其他任何地方一样简单高效。今天我们所强调的功能正是这一多年努力的成果。许多开发者已经在Python Workers中构建应用程序;今天,我们将这些能力正式推向生产环境。 ## Python现已成为Cloudflare Workers运行时的首类语言 Python Workers现在原生支持Cloudflare开发者平台的绑定。之前,在Python Workers中使用这些Cloudflare绑定需要在RPC边界处显式地将Python对象转换为TypeScript对象。例如,向Cloudflare队列发送Python字典需要以下粘合代码才能工作: ```python from pyodide.ffi import to_js import js self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries)) ``` 这要求Python开发者在编写Python Workers时考虑JavaScript环境和代码,这常常导致人类和AI代理出错。为了解决这个问题,我们已在Workers运行时和Python SDK中封装了整个类型转换过程(https://blog.cloudflare.com/python-workers-rpc/)。这使您能够以Pythonic的方式使用所有Cloudflare绑定,而无需编写一行JavaScript代码,从而让以下代码直接工作: ```python self.env.QUEUE.send({"key": "value"}) ``` ## Web框架:FastAPI、Django 和 Flask 现在您可以在Python Workers中运行喜爱的Python框架,如FastAPI、Django或Flask,来构建API服务器。我们实现了一个内置连接器,您可以使用它轻松将Web应用程序连接到Python Workers。假设您有一个简单的FastAPI Web应用程序: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): message = "Hello, world!" return {"message": message} ``` 在原生环境中,您会使用像`uvicorn`这样的Web服务器来运行此应用程序。在Python Workers中,您可以使用我们提供的`workers.asgi`包来运行相同的应用程序,只需将以下代码片段添加到您的代码中: ```python from workers import asgi class Default(WorkerEntrypoint): async def fetch(self, request): return await asgi.fetch(app, request, self.env) # 或等效地 Default = asgi.entrypoint(app) ``` 类似地,您可以使用`workers.wsgi`包来运行同步的Web应用程序,如Django。 ```python from workers import WorkerEntrypoint, wsgi from your_django_app.wsgi import app Default = wsgi.entrypoint(app) ``` ### 那么,底层发生了什么? Python有一套标准协议,规定Web应用程序应如何与Web服务器通信,称为Web服务器网关接口(WSGI),或其现代异步对应物ASGI。该标准允许开发者构建与服务器完全无关的应用程序。在传统部署中,像Uvicorn或Gunicorn这样的Web服务器负责处理多个并发客户端连接和线程以扩展流量,而FastAPI等Web框架则可以专注于应用程序逻辑。在Cloudflare Workers中,Workers平台本身就充当Web服务器。由于我们的全球网络已经无缝处理负载平衡和无限扩展,我们无需在Python Workers内部运行服务器来“重新发明轮子”。相反,我们的`workers.asgi`和`workers.wsgi`连接器充当一个轻薄、优化的桥梁。它们将传入的原生JavaScript请求转换为Python应用程序所期望的标准WSGI/ASGI结构,并以最小的开销将响应无缝传回。通过这样做,Python开发者获得了两全其美的优势:您可以使用喜爱的Web框架编写和组织代码,同时让Cloudflare Workers平台立即将您的API扩展到全球,而无需配置服务器。这些连接器不仅可用于FastAPI、Django或Flask,也可用于任何使用WSGI(https://peps.python.org/pep-3333/)或ASGI(https://asgi.readthedocs.io/en/latest/)接口的Python Web框架。您可以在Python Workers文档(https://developers.cloudflare.com/workers/languages/python/packages/)中找到有关使用每个Web框架的更多信息。 ## 使用Hyperdrive连接PostgreSQL和MySQL 如果您正在使用PostgreSQL或MySQL等关系型数据库构建Python应用程序,现在可以将Hyperdrive(https://developers.cloudflare.com/hyperdrive/)集成到Python Workers中。之前,Python Workers不支持TCP套接字,导致数据库驱动程序无法使用。要理解这为何是障碍,您需要了解WebAssembly的运行方式。像`aiomysql`或`asyncpg`这样的Python数据库驱动程序依赖于标准库的`socket`模块来建立连接。在标准环境中,该模块会向底层操作系统进行POSIX系统调用。在WebAssembly沙箱内,这些POSIX网络系统调用通常是始终失败的桩代码。任何尝试打开标准套接字的操作都会立即失败。为了解决这个问题,我们使用Workers的connect(https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/)API实现了套接字系统调用。当数据库驱动程序尝试打开TCP连接时,它会经过我们的自定义套接字系统调用实现。它将标准的Python套接字操作(如打开连接和读取字节)转换为Workers运行时使用的相应JavaScript调用。由于此转换发生在系统调用级别,您的数据库驱动程序完全无需了解底层实现。这个套接字桥接使得我们的Hyperdrive集成成为可能。要在Python Workers中使用Hyperdrive,首先使用Hyperdrive连接您的数据库,并在Wrangler配置中设置绑定: ```json "hyperdrive": [ { "binding": "HYPERDRIVE_MYSQL", "id": "", } ] ``` 然后,使用您熟悉的数据库驱动程序连接到Hyperdrive: ```python import aiomysql from workers import WorkerEntrypoint class Default(WorkerEntrypoint): async def fetch(self, request): hd = self.env.HYPERDRIVE_MYSQL conn = await aiomysql.connect( host=hd.host, port=int(hd.port), user=hd.user, password=hd.password, db=hd.database, ssl=None, ) cur = await conn.cursor() await cur.execute("SELECT username FROM user") r = await cur.fetchall() await cur.close() conn.close() ``` 您可以参考Hyperdrive Python Workers文档(https://developers.cloudflare.com/hyperdrive/examples/python-workers/),了解如何在Python Workers中使用Hyperdrive以及目前支持哪些软件包。 ## 扩展WebAssembly软件包生态系统 由于Python Workers在WebAssembly沙箱内运行,任何带有原生C/C++/Rust扩展的包都必须交叉编译为WebAssembly才能在Python Workers中运行。然而,以前没有标准的方法来将任何Python包交叉编译为WebAssembly。这意味着我们的团队必须手动编译和托管自定义的WebAssembly包。这极大地限制了您在Python Workers中实际可用的包数量。我们希望解决这个问题,允许用户使用更多种类的包。但是,我们不想仅仅构建只能在Python Workers中使用的包,这对社区没有好处。由于Python Workers建立在Pyodide之上,我们希望生态系统的发展能够惠及Pyodide和整个基于WebAssembly的Python社区。为此,我们提出了PEP 783(https://peps.python.org/pep-0783/),该提案标准化了一个名为PyEmscripten的平台,用于在浏览器运行时中运行Python。经过一年多的讨论和完善,该提案被接受,使软件包维护者能够为PyEmscripten平台构建和发布包,并在所有实现PyEmscripten的环境中使用它们。我们还稳定了现有的Pyodide构建工具链,并将其演变为所有软件包维护者都可访问的形式,使开发者能够轻松地为PyEmscripten平台构建包。此外,我们在`cibuildwheel`(https://cibuildwheel.pypa.io/en/stable/)中添加了PyEmscripten平台支持,以便其他人更容易地采用对PyEmscripten平台的支持。虽然生态系统仍在采用这一标准,但我们希望未来每个Python包都有一个适用于WebAssembly的轮子。我们还在积极与主要软件包维护者合作,添加PyEmscripten构建。如果您遇到尚未支持的包,请在Discord或GitHub上告诉我们,我们的团队将努力使其构建成功。您也可以查看我们EuroPython 2026的演讲:“Python Everywhere: The State of Python on WebAssembly”(https://youtu.be/HklunTc9giA?si=wqeOjDl9qNe6qtB2),了解我们如何实现这一目标。 ## 在Python中构建AI代理和管道 庞大的数据科学和机器学习包生态系统使得Python成为构建智能代理和AI管道的自然选择。但将它们引入Python Workers历来存在一个挑战:像`openai`和`langchain`这样的库依赖于`requests`或`httpx`等HTTP客户端来与外部API通信。然而,由于Python Workers中缺少底层套接字操作支持,这些HTTP客户端无法正常工作。为了解决这个问题,我们向上游贡献了代码,以确保这些HTTP客户端可以在WebAssembly环境中通过JavaScript的`fetch` API直接路由请求。结合我们在前一部分(https://blog.cloudflare.com/python-workers-ga/#using-postgresql-and-mysql-with-hyperdrive)中解释的对底层套接字操作的新支持,这使得整个网络协议栈在Python Workers内无缝工作。因此,您现在可以在Python Workers中原生运行像`openai`、`langchain`和`mcp`这样的AI库。您还可以将它们与Workers AI结合使用,在Cloudflare的网络上运行GPU上的无服务器推理,或通过Cloudflare AI网关代理请求。下面的示例展示了如何在langchain中运行Worker AI模型,使用了langchain-cloudflare(https://github.com/cloudflare/langchain-cloudflare)包: ```python from langchain_cloudflare import ChatCloudflareWorkersAI from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import PromptTemplate from workers import Response, WorkerEntrypoint class Default(WorkerEntrypoint): async def fetch(self, request): prompt = PromptTemplate.from_template( "In one sentence, describe a great day in the life of an {profession}." ) llm = ChatCloudflareWorkersAI( model_name="@cf/meta/llama-3.3-70b-instruct-fp8-fast", binding=self.env.AI, max_tokens=64, ) chain = prompt | llm | StrOutputParser() result = await chain.ainvoke({"profession": "electrician"}) return Response.json({"result": result}) ``` ## 您今天可以构建什么 我们在python-workers-examples(https://github.com/cloudflare/python-workers-examples)仓库中汇集了一系列生产就绪的模式。以下是将Python Workers与Cloudflare生态系统结合使用的一些方式。 ### 异步AI编排 构建全栈AI应用程序通常意味着连接存储、队列和推理等多个服务。此示例(https://github.com/cloudflare/python-workers-examples/tree/main/image-redraw)展示了如何纯粹在Python Workers中构建AI驱动的图像到图像生成器。它接受用户请求,将其放入Cloudflare队列,并使用工作流通过Workers AI编排图像生成步骤,并将图像存储到R2存储桶中。 BLOG-3512 2.png ### 使用Bluesky Jetstream进行实时流处理 消费实时事件流通常需要专用服务器来维护连接。在此示例中,我们使用Python Worker连接到ATProto/Bluesky Jetstream WebSocket(https://github.com/cloudflare/python-workers-examples/tree/main/websocket-stream-consumer)。通过使用持久对象来支持此连接,Python Worker可以维护长时间存在的状态,确保WebSocket连接保持活跃。 BLOG-3512 3.png ### 更多示例供探索 #### 模型上下文协议(MCP)服务器 使用官方Python MCP包构建和部署MCP服务器(https://github.com/cloudflare/python-workers-examples/tree/main/mcp-server),让您的AI助手访问边缘数据。 BLOG-3512 4.png #### 使用Vectorize的检索增强生成(RAG)系统 使用Workers AI和Cloudflare的向量数据库Vectorize构建RAG系统(https://github.com/cloudflare/python-workers-examples/tree/main/vectorize-rag)。 BLOG-3512 5.png ## Cloudflare开发者文档中的Python代码示例 我们已经更新了整个Cloudflare产品的文档,其中包含Python示例代码。几乎在所有展示TypeScript代码示例的地方,现在也有相应的Python代码示例。我们承诺在所有产品中持续包含Python示例。您可以在我们的开发者文档中随时在JavaScript、TypeScript和Python代码片段之间切换。 BLOG-3512 6.png ## 下一步计划? 达到GA只是个开始。我们有很多计划让Python Workers变得更好,包括提升Python Workers的性能和内存效率,以及支持更多的软件包。请继续告诉我们您想在Python Workers上构建什么,我们将持续推动可能性的边界。查看Python Workers文档(https://developers.cloudflare.com/workers/languages/python/),开始构建您的第一个Python Worker吧!

相似文章

Cloudflare Python Workers 现已全面可用

Simon Willison's Blog

Cloudflare Python Workers 已正式发布,通过 WebAssembly 和 Pyodide,现在支持在其边缘网络上执行 Python 代码,此前经过两年的预览阶段。

Workers Cache

Hacker News Top

Cloudflare 推出 Workers Cache,这是一种位于 Workers 前面的分层缓存,允许在不调用 Worker 的情况下提供缓存响应,从而减少 CPU 时间并提高性能。