Streamlit で multiprocessing を使う際の注意点
あけましておめでとうございます。 @kz_morita です。
年末年始休暇に入り面白そうだと思っていた Streamlit で遊んでいました。 その中でコストの高い計算をする際に並列処理を行おうと思い、 multiprocessing で実装を行っていたのですが色々とはまりどころがあったため、まとめます。
やりたいこと やりたいことは以下のようなコードになります。
(以下は動かないコードです)
import streamlit as st import time from multiprocessing import Pool # 2倍を計算 def double(x): print(f"x = {x}") time.sleep(0.01) return x * 2 # multiprocess で動かすための関数 def calcurate(count): with Pool() as p: result = p.map(double, range(count)) return result st.write("Hello world") COUNT = 10000 with st.spinner("Calcurating..."): result = calcurate(COUNT) st.write(result) streamlit 上で 10000 回計算を並列で回して結果を取得しています。 ローディングを出したい為、spinner なども表示していますが基本的にはシンプルなコードです。
上記のコードはエラーがでて動かないのですがこちらをベースにしてハマった点を書きます。
__main__ 内で実行しないと動かない 上記を実行すると以下のようなエラーが発生します。