#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.
Я попытался просмотреть другие приложения, используя множество субинтерпретаторов, но это похоже на очень редкий вариант использования, и я не смог найти никого, у кого была бы такая же проблема.
Есть ли кто-нибудь еще, кто использует много субинтерпретаторов, имеющих подобные проблемы?
Кажется, что в настоящее время мои варианты
- Примите удар по производительности…
- Утечка большого объема памяти и не вызов Py_EndInterpreter
- Коренным образом измените то, как мое приложение встраивает python, и не используйте субинтерпретаторы
- ??