Мы разрабатываем небольшое серверное приложение. Серверное приложение выполняет некоторую обработку данных и отвечает клиенту. Чтобы часть обработки данных была конфигурируемой и гибкой, мы решили пойти на скриптинг и на основе наличия различных готовых модулей мы решили пойти на Python. Мы используем Python-C api для отправки/получения данных между c и python.Проблема параллелизма Python-C api
Алгоритм работает примерно так: -
- Сервер получает некоторые данные от клиента, эти данные хранятся в словаре, созданном в с. Словарь создается с помощью функции api PyDict_New(); от c. Вход хранится как пара значений ключа в словаре, используя функцию api PyDict_SetItemString();
- Далее мы выполняем скрипт python PyRun_SimpleString(); передавая скрипт в качестве параметра. Этот скрипт использует словарь, созданный в c. Обратите внимание: мы создаем словарь, созданный в c, доступный скрипту, используя методы PyImport_AddModule(); и PyModule_AddObject();
- Мы сохраняем результат обработки данных в скрипте как пару ключевых значений в том же словаре, который был создан выше. Затем код c может просто получить доступ к переменной результата (парам ключ-значение) после выполнения сценария.
Проблема Проблема, которую мы сталкиваемся в случае одновременных запросов, поступающих от разных клиентов. Когда несколько запросов поступают от разных клиентов, мы склонны исключать исключения ссылочного числа ссылок. Обратите внимание, что для каждого запроса, который приходит для пользователя, мы создаем независимый словарь для этого пользователя. Чтобы преодолеть эту проблему, мы включили вызов PyRun_SimpleString(); в PyEval_AcquireLock(); и PyEval_ReleaseLock() ;, но при этом выполнение скрипта является блокирующим вызовом. Поэтому, если сценарий занимает много времени для выполнения, все остальные пользователи также ждут ответа.
Не могли бы вы предложить наилучший возможный подход или указать указатели на то, где мы ошибаемся. Пожалуйста, звоните мне для получения дополнительной информации.
Любая помощь/руководство будет оценено по достоинству.
Спасибо за ссылку Джейн. Кстати, я звонил на эти функции, но он все равно не сработает. – Will