Closed euglena1215 closed 3 years ago
- 利用者が Juman インスタンスをスレッド間で共有せず、スレッドごとで Juman インスタンスを利用する
私はこの方法を使ってこの問題を回避しました。
参考実装
from pyknp import Juman
class JumanThreadSafe:
def __init__(self, option='') -> None:
self.juman_by_thread = {}
self.option = option
def analysis(self, text, **kwargs):
now_thread_id = threading.get_ident()
if now_thread_id not in self.juman_by_thread:
self.juman_by_thread[now_thread_id] = Juman(option=self.option)
return self.juman_by_thread[now_thread_id].analysis(text, **kwargs)
サブスレッドから解析が実行される可能性がある場合,KNP あるいは Juman インスタンス作成の際に,multithreading=True
を指定してください.
複数スレッド間で
Juman
インスタンスを共有し analysis を実行すると確率的に処理が止まってしまう事象を観測したので報告します。 私はマルチスレッドで web サーバを起動していたときにこの事象に遭遇しました。再現コード
考えられる原因
内部で実行している
jumanpp
コマンドの標準入力、標準出力の取り扱いで競合が発生し dead lock のような状態になっている。考えられる解決策
Juman#analysis
を thread safe な実装に変更する 2-1. 別スレッドからの参照時は subprocess を作り直す実装に変更する 2-2. そもそもjumanpp
を使い回さずJuman#analysis
の実行毎にjumanpp
コマンドを実行する related https://github.com/ku-nlp/pyknp/pull/28