Процедурный API грамматического словаря полностью поддерживает многопоточный вызов из пользовательских программ.
Это означает, что загруженный экземпляр грамматического словаря (см. описание функции sol_LoadDictionary) можно указывать в вызовах из множества разных потоков.
Кроме того, множество потоков могут одновременно и независимо вызывать функцию морфологического анализа sol_MorphologyAnalysis, получая независимые результаты.
Внутренняя архитектура грамматического движка, и в частности модуля морфологического анализа, предусматривает подгрузку данных из базы данных словаря по мере необходимости. При этом данные, загруженные одним потоком, становятся доступными для других потоков.
К примеру, правила морфологического анализа русского языка загружаются только при необходимости. В момент загрузки правил остальные потоки могут продолжать работу, если только они также не инициируют загрузку правил для русского языка. В таком случае соответствующие потоки будут ждать загрузки правил.
Из особенностей архитектуры отметим, что загрузка правил для каждого языка выполняется независимо. Например, если в многоязычном словаре есть русский и английский языки, то два потока, обрабатывающие соответственно русский и английский текст, вообще не будут блокировать друг друга для подгрузки большинства данных из базы.
Если в качестве хранилища словаря выбрана серверная СУБД, то многопоточная работа через процедурный API дополнительно ограничивается возможностями клиентской и серверной частей БД обслуживать паралелльно поступающие запросы. Для MySQL среди параметров строки подключения в файле конфигурации словаря есть размер пула подключений. Так как одно подключение в этой БД может работать только с одним потоком, то множество потоков в прикладной программе будут ждать освобождения подключения, конкурируя друг с другом за этот ограниченный ресурс.
Ситуация сглаживается кэшированием данных. Благодаря этому загруженная из БД информация, например словарные статьи или правила анализа, становятся доступными для всех потоков, работающих с процедурным API.
Среди примеров использования процедурного API в составе SDK есть программа TestLexicon, написанная на чистом C++. В ней помимо прочих тестов есть также фрагмент для проверки многопоточной работы грамматического словаря. В исходных текстах данная проверка находится в файле test_threading.cpp. См. также подробное описание формата эталонных предложений.
Ключевые особенности морфологического анализатора
API морфологического анализатора
© Козиев Илья 2019
![]() |
|
изменено 05-Feb-12 |