Py_EndInterpreter в Python 3 работает очень медленно

#python #python-3.x #python-2.7 #performance #python-embedding

#python #python-3.x #python-2.7 #Производительность #python-встраивание

Вопрос:

Приложение, над которым я работаю, недавно перешло с встраивания python 2.7 на python 3.8

Мы заметили значительное замедление при вызове Py_EndInterpreter в Python 3.8 при использовании многих субинтерпретаторов.

Глядя на загрузку процессора, я вижу, что все время тратится на сборку мусора. Py_EndInterpreter -> PyImport_Cleanup -> _PyGC_CollectNoFail -> собирать.

99% процессорного времени тратится на метод сбора _PyGC_CollectNoFail

Вызов Py_EndInterprter при наличии 500 субинтерпретаторов каждый вызов Py_EndInterpreter занимает 2 секунды!! В общей сложности ~ 3 минуты для завершения работы 500 субинтерпретаторов.

Для сравнения, в python 2.7 каждый вызов Py_EndInterpreter занимает 1 или 2 мс независимо от того, сколько субинтерпретаторов активны, в общей сложности ~ 500 мс для закрытия всех субинтерпретаторов.

При использовании нескольких субинтерпретаторов (менее 20) производительность практически одинакова между python 2.7 и 3.8.

Я попытался просмотреть другие приложения, используя множество субинтерпретаторов, но это похоже на очень редкий вариант использования, и я не смог найти никого, у кого была бы такая же проблема.

Есть ли кто-нибудь еще, кто использует много субинтерпретаторов, имеющих подобные проблемы?

Кажется, что в настоящее время мои варианты

  1. Примите удар по производительности…
  2. Утечка большого объема памяти и не вызов Py_EndInterpreter
  3. Коренным образом измените то, как мое приложение встраивает python, и не используйте субинтерпретаторы
  4. ??