这是一个好主意,通过删除来最小化垃圾收集器的工作

时间:2019-02-13 06:41:02

标签: python django garbage-collection

假设我们有一个APIView,它返回大的查询集。这样可以减少垃圾收集器的工作量吗?

class MyView(APIView) 
  def get_list(self, request, format=None):
    params=request.query_params
    result = MyModel.objects.all()
    serializer = MyModelSerializer(result, many=True)
    del result #deleting explicitly here
    del params #deleting explicitly here
    return Response(serializer.data, status=status.HTTP_200_OK)

我了解到在每个请求中调用gc.collect()并不是一个好主意。这是个好主意,以使垃圾收集器拥有更少的东西来收集垃圾吗?

1 个答案:

答案 0 :(得分:1)

首先,您的del语句不会执行任何操作,因为这些变量引用的对象还有指向它们的其他引用。

第二,即使不是这种情况,del语句也会删除变量,但不要垃圾收集其引用的数据。

最后,自动垃圾收集旨在减轻开发人员不必显式取消分配内存的负担。用垃圾收集语句添加代码将使a)成为最佳垃圾收集算法的障碍,并且b)会降低代码的可读性。

说了这么多,我遇到了性能故障排除情况,所有迹象都指向垃圾收集器,并且很想添加一个明确的垃圾收集语句。通常,即使这种措施在短期内有所帮助,问题也会在某个时候再次出现。

至少在微服务领域,针对垃圾收集问题的现代解决方案包括完全禁用垃圾收集,并在达到一定内存阈值时关闭/重新启动该过程。