13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Streamlitのパフォーマンス問題に対処するフレームワークStreamsyncについて

Last updated at Posted at 2023-10-10

streamsync

streamlitplotly dashの良いとこ取りのPython Webフレームワーク

streamlitでの難点である何かのページイベントが走るたびに、スクリプトの先頭から実行されて Running… という通信とレンダリング待ちはない。
streamsyncではイベントハンドラーによってDOMの一部のみ再レンダリングされます。
(Streamlitの内部でスクリプトがどのように実行されるか詳細はこちらを参照ください。)

  • コンポーネント(Vueのように画面で使うイベントに紐づくボタンなどのコンポーネントがPythonで用意されている。)

  • イベントハンドラー(plotly dashのようにイベントに紐づく関数を定義出来て、フロントエンドでイベントが走ると、バックエンドに引数などデータが転送され、そのハンドラー関数だけ実行される。終わるとフロントエンドにデータが返され、対応するコンポーネントが再レンダリングされる。)

def display_message(state, value):
    print(“The button has been clicked”)

ss.button(“Click me”, handlers={“click”: display_message})
  • ステート(@付きのバインド変数が利用できて、イベントで状態が変更されるとフロントエンドの値が変わる。状態駆動型のリアクティブなユーザー インターフェイスを使用して、ユーザー インターフェイスはロジックから切り離されています。バックエンドを変更することなく、テキストコンポーネントの見出しを置き換えたり、必要な数のコンポーネントに表示したりできます。)
def choose_coffee(state, value):
    state[“drink”] = “Coffee”

def choose_tea(state, value):
    state[“drink”] = “Tea”

ss.init_state({“drink”: “None selected”})
ss.heading(“@drink”)
ss.button(“Coffee”, handlers={“click”: choose_coffee})
ss.button(“Tea”, handlers={“click”: choose_tea})
  • 条件付きレンダリング(ユーザーの選択によって、特定のコンポーネントを表示・非表示出来る。)
with ss.when(lambda state: state[“coffee_count”] > 3):
    ss.text(“You’ve had too many coffees.”)
    ss.text(“Yes, 3 is the limit.”)

パフォーマンス測定

クリックしてDOM操作するのに、streamsyncの方が73倍速い
df5124b9-b9de-4378-93e2-aa153aa7e565.jpeg

ビジュアルユーザーインターフェースエディタ

デスクトップアプリを作るときのように、画面の細かいコンポーネントをビジュアルエディタで調整出来る。
f74bc89c-ae17-49b5-b660-f2f54cb3db57.gif

アーキテクチャ

Python、TypeScript、Vue、および FastAPI を使用して構築されています。

e81433d3-f311-4f37-a68e-4f40785b520b.jpeg

  1. イベントが発生すると、WebSocket を使用してブラウザから Web サーバーにイベントが送信されます。

  2. WebSocketの呼び出しに応じて、Web サーバー (FastAPI) はasyncioを介して非同期で AppRunnerに処理を渡します。

  3. AppRunner は、multiprocessing.Pipeを介してアプリのコードの実行を担当する分離プロセスである AppProcess にディスパッチします。(マルチプロセスのプロセス間通信で変数を引き継ぎ・引数を渡してイベントハンドラーを実行する。)

  4. AppProcess は、関連するセッションのアプリケーション状態を使用して、適切なイベント ハンドラーを見つけてスレッド プールで実行します。

参考リンク

13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?