Python Workers が一般提供開始
Python Workers are now generally available (blog.cloudflare.com)
要約
Cloudflare Workers 上で Python アプリケーションを実行できる Python Workers が、2年間のプレビュー期間を経て一般提供 (GA) となりました。これにより、Python コード、ライブラリ、フレームワーク(FastAPI, Django, Flask など)を Cloudflare の各種サービス(Workers AI, R2, D1 など)とシームレスに連携させることが可能になります。WebAssembly 上で動作する Pyodide インタープリタと、最適化された WSGI/ASGI コネクタにより、高いパフォーマンスとスケーラビリティを実現します。
全文翻訳
Python Workers が一般提供開始
2年前に Python Workers を導入し、Cloudflare Workers ランタイムで Python アプリケーションを実行する 方法を提供しました。私たちの目標は、TypeScript で Workers を書くのと同じくらい簡単に Python で書けるようにし、Python のパッケージやフレームワークのエコシステムが「そのまま動作する」ようにすることでした。
本日、Python Workers が一般提供(GA)となりました。
GA とは何を意味するのでしょうか?それは、Python が Cloudflare Developer Platform における第一級の、完全にサポートされた言語になったことを意味します。使い慣れた Python コード、ライブラリ、デザインパターンを持ち込み、Workers AI、R2、D1、Hyperdrive、Durable Objects、Queues、Workflows、そして Cloudflare プラットフォームの他のサービスとシームレスに連携させることができます。また、FastAPI、Django、Flask のような人気の Python フレームワークを Python Workers 内で実行することも可能です。さらに、Dynamic Workers を使用して、別の Worker 内で Python Worker を作成することさえできます。
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 の開発の道のり
Cloudflare Workers に Python を導入することは自然な選択でした。Workers は 2018年から WebAssembly をサポートしている ため、Wasm コンパイルされた Python インタープリタを実行するのに最適な環境を提供してくれました。Pyodide を使用することで、Cloudflare Workers で幅広い Python アプリケーションを迅速にサポートすることができました。
私たちの目標は、無限にスケーラブルな Python アプリケーションのための最初のプラットフォームを作成すると同時に、どこで開発するよりも簡単でパフォーマンスの高いものにすることでした。
本日ハイライトする機能は、この数年間の努力の結果です。多くの開発者がすでに Python Workers 内でアプリケーションを構築しており、本日、これらの機能をすべての人にとって本番環境対応にします。
Python は Cloudflare Workers ランタイムにおける第一級言語になりました
Python Workers は、Cloudflare Developer Platform のバインディングをネイティブでサポートするようになりました。以前は、Python Workers でこれらの Cloudflare バインディングを使用するには、RPC 境界で Python オブジェクトを明示的に TypeScript オブジェクトに変換する必要がありました。例えば、Python の辞書を Cloudflare Queue に送信するには、以下のグルーコードが必要でした。
from pyodide.ffi import to_js
import js
self.env.QUEUE.send(to_js({"key": "value"}, dict_converter=js.Object.fromEntries))
これは、Python 開発者が Python Worker を記述する際に JavaScript 環境とコードを念頭に置く必要があり、人間と AI エージェントの両方にとって一般的なエラーの原因となっていました。この問題に対処するため、私たちは Workers ランタイムと Python SDK 内に タイプ変換プロセス全体をカプセル化しました。これにより、JavaScript コードを一行も書かずに、Pythonic な方法ですべての Cloudflare バインディングを利用できるようになり、以下のようなことが「そのまま動作」するようになります。
self.env.QUEUE.send({"key": "value"})
Web フレームワーク: FastAPI、Django、Flask
FastAPI、Django、Flask のようなお気に入りの Python フレームワークを実行して、Python Workers で API サーバーを構築できるようになりました。Web アプリケーションを Python Workers に簡単に接続できる組み込みコネクタを実装しました。
簡単な FastAPI Web アプリケーションがあるとしましょう。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
message = "Hello, world!"
return {"message": message}
ネイティブ環境では、uvicorn のような Web サーバーを使用してこのアプリケーションを実行します。
$ uvicorn main:app
Python Workers では、提供する workers.asgi パッケージを使用して同じアプリケーションを実行できます。コードにこのスニペットを追加するだけです。
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 パッケージを使用して、Django のような同期 Web アプリケーションを実行できます。
from workers import WorkerEntrypoint, wsgi
from your_django_app.wsgi import app
Default = wsgi.entrypoint(app)
では、舞台裏では何が起こっているのでしょうか?
Python には、Web アプリケーションが Web サーバーと通信する方法に関する標準的な契約があり、Web Server Gateway Interface (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 または ASGI インターフェースを使用する Python Web フレームワークであれば何にでも使用できます。
各 Web フレームワークの使用方法については、Python Workers ドキュメントで詳細を確認できます。
Hyperdrive を使用した PostgreSQL および MySQL
PostgreSQL や MySQL のようなリレーショナルデータベースを使用して Python アプリケーションを構築している場合、Hyperdrive を Python Workers に統合できるようになりました。
以前は、Python Workers は TCP ソケットをサポートしていなかったため、データベースドライバーが利用できませんでした。これがブロックとなった理由を理解するには、WebAssembly がどのように動作するかを見る必要があります。aiomysql や asyncpg のような Python データベースドライバーは、標準ライブラリの socket モジュールに依存して接続を確立します。標準的な環境では、このモジュールは基盤となるオペレーティングシステムに対して POSIX システムコールを発行します。WebAssembly サンドボックス内では、これらの POSIX ネットワーク syscall は通常、常に失敗するスタブです。標準ソケットを開こうとする試みはすぐに失敗します。この問題を解決するために、Workers の connect API を使用してソケットシステムコールを実装しました。
データベースドライバーが TCP 接続を開こうとすると、カスタムソケット syscall 実装を通過します。これは、接続を開いたりバイトを読み取ったりする標準的な Python ソケット操作を、Workers ランタイムが使用する対応する JavaScript 呼び出しに変換します。この変換はシステムコールレベルで行われるため、データベースドライバーは基盤となる実装についてまったく知る必要がありません。
このソケットブリッジが、Hyperdrive 統合を可能にしています。Python Workers で Hyperdrive を使用するには、まずデータベースを Hyperdrive に接続し、Wrangler 設定でバインディングを設定します。
"hyperdrive": [
{
"binding": "HYPERDRIVE_MYSQL",
"id": "<example id: 57b7076f58be42419276f058a8968187>",
}
]
次に、使い慣れたデータベースドライバーを使用して Hyperdrive に接続します。
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()
Python Workers で Hyperdrive を使用する方法や、現在サポートされているパッケージについては、Hyperdrive Python Workers ドキュメントを参照してください。
WebAssembly パッケージエコシステムの拡大
Python Workers は WebAssembly サンドボックス内で実行されるため、ネイティブ C/C++/Rust 拡張機能を持つパッケージは、Python Workers で実行するために WebAssembly にクロスコンパイルする必要があります。しかし、以前は、任意の Python パッケージを WebAssembly にクロスコンパイルするための標準的な方法がありませんでした。そのため、私たちのチームはカスタム WebAssembly パッケージを手動でコンパイルしてホストする必要がありました。これにより、Python Workers で実際に使用できるパッケージの数が大幅に制限されていました。
この問題を解決し、より幅広いパッケージを使用できるようにしたかったのです。しかし、Python Workers だけで使用できるパッケージを構築するだけでは、コミュニティに利益をもたらさないでしょう。Python Workers は Pyodide を基盤としているため、Pyodide と Python-on-WebAssembly コミュニティ全体に利益をもたらすようなエコシステムの進化を望んでいました。
この目的のため、ブラウザランタイムで Python を実行するためのプラットフォームである PyEmscripten を標準化する PEP 783 を提案しました。1 年以上の議論と改善を経て、この提案は受け入れられ、パッケージメンテナーは PyEmscripten プラットフォーム用のパッケージをビルドおよび公開し、PyEmscripten を実装するすべての環境で利用できるようにすることが可能になりました。
エコシステムはまだこの標準を採用中ですが、将来的にはすべての Python パッケージが WebAssembly で動作する wheel を持つようになることを願っています。また、主要なパッケージメンテナーと協力して PyEmscripten ビルドを追加しています。まだサポートされていないパッケージに遭遇した場合は、Discord または GitHub でお知らせください。私たちのチームがビルドに取り組むようにします。
EuroPython 2026 の講演「Python Everywhere: The State of Python on WebAssembly」 をご覧いただくと、これがどのように可能になったかを確認できます。
Python で AI エージェントとパイプラインを構築する
データサイエンスおよび機械学習パッケージの広範なエコシステムにより、Python はインテリジェントエージェントや AI パイプラインの構築に自然な選択肢となっています。しかし、これらを Python Workers に持ち込むことは、これまで課題でした。openai や langchain のようなライブラリは、外部 API と通信するために requests や httpx のような HTTP クライアントに依存しています。しかし、Python Workers で低レベルのソケット操作サポートが不足していたため、これらの HTTP クライアントは正しく動作しませんでした。
これを解決するために、これらの HTTP クライアントが WebAssembly 環境で JavaScript の fetch API を直接ルーティングできるように、アップストリームに貢献しました。これは、前のセクションで説明した低レベルソケット操作のサポートと組み合わせることで、Python Workers 内でネットワークスタック全体がシームレスに機能するようになります。
その結果、openai、langchain、mcp のような AI ライブラリを Python Workers でネイティブに実行できるようになりました。また、これらを Workers AI と組み合わせて Cloudflare のネットワーク上の GPU でサーバーレス推論を実行したり、Cloudflare AI Gateway を介してリクエストをプロキシしたりすることもできます。
以下の例は、langchain-cloudflare パッケージを使用して、langchain で Worker AI モデルを実行する方法を示しています。
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 リポジトリに、本番環境対応のパターンコレクションをまとめました。Python Workers と Cloudflare エコシステムを組み合わせる方法はいくつかあります。
非同期 AI オーケストレーション
フルスタック AI アプリケーションの構築は、ストレージ、キューイング、推論などの複数のサービスを接続することを意味することがよくあります。この例 は、Python Workers だけで AI ドリブンな画像生成アプリケーションを構築する方法を示しています。ユーザーリクエストを受け付け、Cloudflare Queue にドロップし、Workflows を使用して Workers AI 経由で画像生成ステップをオーケストレーションし、画像を R2 バケットに保存します。
[画像: BLOG-3512 2.png]
Bluesky Jetstream によるリアルタイムストリーム処理
リアルタイムイベントのファイヤーホースを消費するには、通常、接続を維持するための専用サーバーが必要です。この例では、Python Worker を使用して ATProto/Bluesky Jetstream WebSocket に接続します。この接続を Durable Object でバックアップすることで、Python Worker は長期的な状態を維持でき、WebSocket 接続がアクティブなままであることを保証します。
[画像: BLOG-3512 3.png]
その他の探索すべき例
Model Context Protocol (MCP) Server
公式 Python MCP パッケージを使用して MCP サーバーを構築およびデプロイ し、AI アシスタントにエッジデータへのアクセスを提供します。
[画像: BLOG-3512 4.png]
Vectorize を使用した Retrieval-Augmented Generation (RAG) システム
Workers AI と Cloudflare のベクトルデータベースである 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 ドキュメント をチェックして、最初の Python Worker の構築を開始してください!