手动提示垃圾收集

我已经完成了很多网络搜索,相当多的cource读取以及
很多杂项刮擦,我发现我不是
一定要接近理想的解决方案.
我有一个python/c接口层,基本上可以执行以下操作:
py_xdecref(some_callback);
关闭服务(Some_service);
返回;
当然,问题是在我的python层中回到
由于py_xdecref调用,准备将其分配给分配的对象
以上;这些对象具有__del__()方法,调用调用
即将在上面的第二行中关闭的服务.
我想修改上述序列以手动提示Python的垃圾
收集例程接管(在这里不是性能的问题),
类似于以下内容:
py_xdecref(some_callback);
pycollect_garbage();
关闭服务(Some_service);
返回;
那可能吗?
我可以通过对服务的其他复杂跟踪来解决这个问题
在C层中,但是如果垃圾,问题将完全消失
可以明确调用收集.我怀疑可能的解决方法
将涉及从上述C函数返回,让任何发生的事情
几次,我返回后才调用真正的关闭()
到C层.以机智:
py_xdecref(some_callback);
标记孔(Some_service);
返回;
(...时间通过python空间,调用C函数...)
if(servicesNeedClosing()){colleservices(); }
返回;
但是,我更希望明确的解决方案作为上述解决方案
继续依赖于垃圾收集的假设
在我不关注的某个时候神奇.
我已经阅读和/或尝试过的解决方案,并且对不完全感兴趣
在听到更多有关:
1.不要使用__del__方法.
我正在使用__del__方法,否则这些方法正在做正确的事
在非序列敏感情况下,因此此选项不在表格.
2.不要假设__del__方法会及时调用
时尚.
我不是在做这个假设,而是我想
*明确*断言垃圾收集已经发生.
3.使用GC模块(或PYGC_Collect).
这些似乎仅解决带有循环引用的情况,
这不是我的问题 - py_xdecref呼叫使得正确
发生,只是垃圾收集在 *之后发生 *
服务已正确关闭.我尝试插入电话
pygc_collect(包括" while(pygc_collect()0)"的调用)
行为没有变化.
欢迎建议.
干杯,
- Kyle

标签: python

添加新评论