"finalize" 在 Julia 中是什么意思?

What does it mean to "finalize" in Julia?

我目前正在使用 CUDArt 包。 GitHub documentation 在加载包含自定义 CUDA C 内核的 ptx 模块时包含以下代码片段:

md = CuModule("mycudamodule.ptx", false)  # false means it will not be automatically finalized

(原评论)

我想了解这个 false 最终确定选项的确切含义以及我何时/不想使用它。我在 SO (What is the right way to write a module finalize method in Julia?) 上遇到了这个 post。它从 Julia 文档中引用为:

finalizer(x, function)

Register a function f(x) to be called when there are no program-accessible references to x. The behavior of this function is unpredictable if x is of a bits type.

虽然我不太明白这是什么意思,甚至不知道这里的定型是否与 CUDArt 示例中提到的相同。例如,当程序无法访问该参数时,尝试在参数 x 上调用函数对我来说没有意义——这怎么可能呢?因此,我将不胜感激任何澄清方面的帮助:

  1. Julia 中 "finalize" 和
  2. 的含义
  3. 当我 would/would 不想在使用 CUDArt 导入 .ptx 模块的上下文中使用它时

我不能代表 CUDArt,但这是 finalize 在 Julia 中的意思:当垃圾收集器检测到 程序 无法再访问该对象时,然后它将 运行 终结器,然后收集(释放)对象。请注意,垃圾收集器仍然可以访问对象,即使程序不能。

这是一个例子:

julia> type X
           a
       end
julia> j = X(1)  # create new X(1) object, accessible as j
julia> finalizer(j, println)  # print the object when it's finalized
julia> gc()      # suggest garbage collection; nothing happens
julia> j = 0     # now the original object is no longer accessible by the program
julia> gc()      # suggest carbage collection
X(1)             # object was collected... and finalizer was run

这很有用,可以在收集对象时释放外部资源(例如文件句柄或 malloced 内存)。

我无法发表评论,但我想补充一下 docs:

finalizer(f, x)

f must not cause a task switch, which excludes most I/O operations such as println. Using the @async macro (to defer context switching to outside of the finalizer) or ccall to directly invoke IO functions in C may be helpful for debugging purposes.