Python 3中的Py_EndInterpreter非常慢

问题描述

我正在处理的应用程序最近从嵌入python 2.7迁移到python 3.8

在使用许多子解释器的Python 3.8中调用Py_EndInterpreter时,我们注意到速度明显下降。

查看cpu使用率,我发现所有时间都花在了垃圾收集上。 Py_EndInterpreter-> PyImport_Cleanup-> _PyGC_CollectNoFail->收集。

99%的cpu时间花费在_PyGC_CollectNoFail的collect方法

当有500个子解释器时调用Py_EndInterprter,每次调用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. ??

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...