在Julia中,“finalize”是什么意思?

7

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

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

(原始评论)

我正在尝试理解 finalize 中的 false 选项到底意味着什么,以及何时我会/不会想要使用它。我在 SO 上找到了这篇文章(What is the right way to write a module finalize method in Julia?)。它引用了 Julia 文档中的内容:

finalizer(x, function)

注册一个函数 f(x),当没有程序可访问的 x 引用时调用该函数。如果 x 是位类型,则此函数的行为是不可预测的。

然而,我并不真正理解这意味着什么,甚至不知道这里的 finalizing 是否与 CUDArt 示例中提到的相同。例如,当程序无法访问参数 x 时,尝试在该参数上调用函数是毫无意义的——这怎么可能呢?因此,我希望能够得到以下问题的澄清:

  1. 在 Julia 中,“finalize”是什么意思?
  2. 在导入带有 CUDArt 的 .ptx 模块的上下文中,何时需要/不需要使用它?
2个回答

6
我无法对CUDArt进行评价,但以下是在Julia中finalize的意义:当垃圾回收器检测到程序不能再访问该对象时,它将运行finalizer,然后收集(释放)该对象。请注意,尽管程序无法访问该对象,但垃圾回收器仍然可以访问该对象。
以下是一个示例:
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

这样做的好处是,当一个对象被回收时,外部资源(例如文件句柄或使用 malloc 分配的内存)将会自动释放。


0

我不能评论,但我想从docs中补充一点:

finalizer(f, x)

f 不能导致任务切换,这排除了大多数 I/O 操作,例如 println。使用 @async 宏(将上下文切换推迟到 finalizer 外部)或 ccall 直接调用 C 中的 IO 函数可能有助于调试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接