Koziev / GrammarEngine

Грамматический Словарь Русского Языка (+ английский, японский, etc)
MIT License
75 stars 20 forks source link

CRFSuite не преднаначен для многопоточной работы #9

Closed olegtarasov closed 6 years ago

olegtarasov commented 6 years ago

Столкнулся с проблемой при использовании морфологического анализатора с флагом SOL_GREN_MODEL из нескольких потоков. Вызов crfsuite_instance_finish в SequenceLabeler.cpp довольно быстро ломает кучу. Судя по исходникам CRFSuite, в нём не предусмотрена работа с одной моделью из нескольких потоков. tagger->set устанавливает текущему таггеру инстанс, и пока один поток выполняет анализ, второй поток может установить тому же таггеру новый инстанс, после чего первый поток окажется в неизвестном состоянии.

Для себя я решил эту проблему с помощью пула GrammarEngine'ов, который выдаёт каждому потоку полностью изолированный инстанс всего движка.

Koziev commented 6 years ago

Добрый день, Олег,

Столкнулся с проблемой при использовании морфологического анализатора с флагом SOL_GREN_MODEL из нескольких потоков. Вызов crfsuite_instance_finish в SequenceLabeler.cpp довольно быстро ломает кучу. Судя по исходникам CRFSuite, в нём не предусмотрена работа с одной моделью из нескольких потоков. tagger->set устанавливает текущему таггеру инстанс, и пока один поток выполняет анализ, второй поток может установить тому же таггеру новый инстанс, после чего первый поток окажется в неизвестном состоянии.

спасибо за информацию, добавил крит. секцию в SequenceLabelerModel::Apply (SequenceLabeler.cpp).