HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

Python Workers が一般提供開始

Python Workers are now generally available (blog.cloudflare.com)

91 pointsby torutofu6 コメント

要約

Cloudflare Workers 上で Python アプリケーションを実行できる Python Workers が、2年間のプレビュー期間を経て一般提供 (GA) となりました。これにより、Python コード、ライブラリ、フレームワーク(FastAPI, Django, Flask など)を Cloudflare の各種サービス(Workers AI, R2, D1 など)とシームレスに連携させることが可能になります。WebAssembly 上で動作する Pyodide インタープリタと、最適化された WSGI/ASGI コネクタにより、高いパフォーマンスとスケーラビリティを実現します。

全文翻訳

2年前、私たちはPython Workersを導入し、Cloudflare WorkersランタイムでPythonアプリケーションを実行できるようにしました。私たちの目標は、TypeScriptでWorkersを書くのと同じくらい簡単にPythonでWorkersを書けるようにし、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を作成することさえ可能です。 ```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の背後にある道のり Cloudflare WorkersにPythonをもたらすことは、自然な選択でした。Workersは2018年からWebAssemblyをサポートしているため、WasmコンパイルされたPythonインタープリタを実行するための完璧な環境を提供してくれました。Pyodideを使用することで、Cloudflare Workersで幅広いPythonアプリケーションを迅速にサポートすることができました。 私たちの目標は、無限にスケーラブルなPythonアプリのための最初のプラットフォームを作成し、同時にどこでもPythonアプリを開発するのと同じくらい簡単かつ高性能にすることでした。 本日強調している機能は、この数年間の取り組みの成果です。多くの開発者がすでにPython Workers内でアプリケーションを構築しています。本日、これらの機能をすべての人にとって本番環境で利用可能にします。 PythonはCloudflare Workersランタイムにおけるファーストクラスの言語になりました Python Workersは、Cloudflare Developer Platformのバインディングをネイティブにサポートするようになりました。以前は、Python WorkersでこれらのCloudflareバインディングを使用するには、RPC境界でPythonオブジェクトをTypeScriptオブジェクトに明示的に変換する必要がありました。例えば、Python辞書をCloudflare Queueに送信するには、以下のグルーコードが必要でした。 ```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内にカプセル化しました。これにより、JavaScriptコードを一行も書かずに、Pythonicな方法で全てのCloudflareバインディングを利用できるようになり、以下のようなコードがそのまま動作するようになります。 ```python self.env.QUEUE.send({"key": "value"}) ``` Webフレームワーク: FastAPI、Django、Flask FastAPI、Django、Flaskのようなお気に入りのPythonフレームワークを実行して、Python WorkersでAPIサーバーを構築できるようになりました。WebアプリケーションをPython Workersに簡単に接続できる組み込みコネクタを実装しました。 簡単なFastAPI Webアプリケーションがあるとしましょう。 ```python from fastapi import FastAPI app = FastAPI() @app.get("/") def root(): message = "Hello, world!" return {"message": message} ``` ネイティブ環境では、uvicornのようなWebサーバーを使用してこのアプリケーションを実行します。 ```bash $ uvicorn main:app ``` Python Workersでは、コードにこのスニペットを追加するだけで、提供するworkers.asgiパッケージを使用して同じアプリケーションを実行できます。 ```python from workers import asgi, WorkerEntrypoint class Default(WorkerEntrypoint): async def fetch(self, request): return await asgi.fetch(app, request, self.env) # または同等に # Default = asgi.entrypoint(app) ``` 同様に、Djangoのような同期Webアプリケーションを実行するためにworkers.wsgiパッケージを使用できます。 ```python 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データベースドライバーは、標準ライブラリのソケットモジュールに依存して接続を確立します。標準環境では、このモジュールは基盤となるオペレーティングシステムにPOSIXシステムコールを発行します。WebAssemblyサンドボックス内では、これらのPOSIXネットワークシステムコールは通常、常に失敗するスタブです。標準ソケットを開こうとする試みはすぐに失敗します。 この問題を解決するために、Workers Connect APIを使用してソケットシステムコールを実装しました。 データベースドライバーがTCP接続を開こうとすると、カスタムソケットシステムコール実装を通過します。これは、標準的なPythonソケット操作(接続のオープンやバイトの読み取りなど)を、Workersランタイムによって使用される対応するJavaScript呼び出しに変換します。この変換はシステムコールレベルで行われるため、データベースドライバーは基盤となる実装について知る必要はありません。 このソケットブリッジが、Hyperdrive統合を可能にしている理由です。Python WorkersでHyperdriveを使用するには、まずHyperdriveでデータベースを接続し、Wrangler設定でバインディングを設定します。 ```yaml "hyperdrive": [ { "binding": "HYPERDRIVE_MYSQL", "id": "<example id: 57b7076f58be42419276f058a8968187>", } ] ``` 次に、使い慣れたデータベースドライバーを使用して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のドキュメントを参照すると、Python WorkersでHyperdriveをどのように使用できるか、および現在サポートされているパッケージを確認できます。 WebAssemblyパッケージエコシステムの拡張 Python WorkersはWebAssemblyサンドボックス内で実行されるため、ネイティブC/C++/Rust拡張機能を持つパッケージはWebAにクロスコンパイルする必要があります。