🙆‍♀️

workerdのpyodide統合を試す

2024/02/04に公開

昨年末ぐらいからworkerdのPyodide統合の開発が活発になっている

search results: repo:cloudflare/workerd pyodide

PyodideはWasmを使ってPythonインタプリターをブラウザ上で実行する環境で、これがリリースされるとRustサポートのようにCloudflare WorkersにPythonで書いたコードを直接デプロイできるようになると思われる

https://developers.cloudflare.com/workers/runtime-apis/webassembly/rust/

cloudflare/python-worker-hello-worldが以前からあったがこれはpythonのコードを事前にjavascriptに変換するというやつでWasmではない

セットアップ

cloudflare/workerdのTCP接続機能を試すではなぜかworkerd自体のbazel buildからはじめてしまっていたが、このpyodide統合を試すだけならReleases · cloudflare/workerdからバイナリをダウンロードしてくるだけでよかった

❯ ./workerd-darwin-arm64 --version
workerd 2024-01-29

実行

サンプルコードは以下にある

❯ git clone https://github.com/cloudflare/workerd.git --depth 1
❯ cd workerd/samples/pyodide

https://github.com/cloudflare/workerd/blob/3c85053b83a5200dffc5be5ae26cbe7577cd5ea5/samples/pyodide/config.capnp

(name = "worker.py", pythonModule = embed "./worker.py"),

の部分は最近変更があったので古いバージョンだとname = "worker"にしないとエラーが出るかもしれない

https://github.com/cloudflare/workerd/blob/3c85053b83a5200dffc5be5ae26cbe7577cd5ea5/samples/pyodide/worker.py

以下のように実行すると http://localhost:8080/ にhello worldが表示される

❯ ./workerd-darwin-arm64 serve config.capnp --experimental

サードパーティモジュールの扱いについては実行時にmicropipで遅延インストールが走る

fastapilangchainなんかは既にロードできるみたいだ

依存モジュールはworkerdのconfigファイル内に書く

https://github.com/cloudflare/workerd/blob/3c85053b83a5200dffc5be5ae26cbe7577cd5ea5/samples/pyodide-langchain/config.capnp#L23-L30

読み込んだモジュール名が出力される

❯ ./workerd-darwin-arm64 serve config.capnp --experimental
Loading aiohttp, aiosignal, frozenlist, async-timeout, attrs, six, charset-normalizer, multidict, yarl, idna, ssl, openssl, requests, urllib3, certifi, tqdm, numpy, pydantic, typing-extensi
ons, sqlalchemy, sqlite3, pyyaml

Discussion