问题描述
我正在处理的应用程序最近从嵌入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的性能几乎相同。
我尝试使用许多子解释器查看其他应用程序,但这似乎是一个非常罕见的用例,找不到其他遇到相同问题的人。
还有其他人在使用许多具有类似问题的子解释器吗?
似乎我目前的选择是
- 取得出色表现...
- 泄漏一堆内存,而不调用Py_EndInterpreter
- 从根本上改变我的应用程序嵌入python而不使用子解释器的方式
- ??
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)