Несколько независимых встроенных интерпретаторов Python для нескольких потоков операционной системы, вызванных из C / C ++-программы

Внедрение интерпретатора Python в приложении C / C ++ хорошо документировано . Каков наилучший подход для запуска нескольких интерпретаторов python в нескольких потоках операционной системы (т.е. один интерпретатор в одном потоке операционной системы в рамках одного процесса), который вызывается из приложения C / C ++? Такие приложения могут также иметь проблемы, связанные с фрагментацией памяти и ограничениями Py_Finalize () .

Одним из таких подходов может быть следующее:

  1. Поток Python и, следовательно, GIL отключен в pyconfig.h, чтобы он был простым (#undef WITH_THREAD)
  2. Все измененные глобальные переменные исходного кода Python Interpreter переместились в выделенную кучу структуру, на которую ссылаются через локальное хранилище потоков (ссылка: Python на телефоне ).

Мои вопросы:

  1. Есть ли лучший подход?
  2. Существуют ли какие-либо инструменты, которые могут автоматизировать преобразование глобальных переменных исходного кода Python Interpreter в кучную выделенную структуру, на которую ссылаются через TLS (Thread Local Storage)?

Похожие темы обсуждаются здесь:

  • Несколько независимых интерпретаторов Python в программе на C / C ++?
  • Несколько интерпретаторов питона в одном и том же процессе
  • Lua Versus Python

  • Что так плохо с threadlocals
  • Почему использование локаторов потоков в Django плохо?
  • One Solution collect form web for “Несколько независимых встроенных интерпретаторов Python для нескольких потоков операционной системы, вызванных из C / C ++-программы”

    Это не совсем ответ на ваш вопрос, но вы можете использовать отдельные процессы вместо потоков, тогда проблемы должны исчезнуть.

    Плюсы:

    • Нет необходимости взломать python (и убедиться, что результат работает во всех предполагаемых случаях)
    • Вероятно,
    • Простое обновление до новых версий python
    • Четко определенные интерфейсы между различными процессами, поэтому легче получить право и отладить

    Минусы:

    • Возможно, немного больше избыточного веса, в зависимости от вашей платформы ( относительно легкие процессы на Linux )

    Если вы используете разделяемую память для IPC, то полученный вами код приложения не должен сильно отличаться от того, что вы получите с потоками.

    Учитывая, что некоторые люди утверждают, что вы всегда должны использовать процессы над потоками , я бы, по крайней мере, рассматривал это как альтернативу, если он каким-либо образом соответствует вашим ограничениям.

    Python - лучший язык программирования в мире.