我正在尝试找到在Julia中使用finalizers的正确方法。
请参阅Julia文档:
然后我尝试测试Package,但是虽然测试通过,但我收到了错误提示:
根据以上测试案例,我有一些问题:
请参阅Julia文档:
首先,我生成了一个名为TestModule.jl的TestModule标准包。finalizer(x, function)
注册函数f(x),当没有程序可访问的引用x时调用该函数。如果x是bits类型,则该函数的行为是不可预测的。
#in TestModule.jl
module TestModule
end
finalizer(TestModule,(t)->println("fin"))
还需要一个 runtest.jl 文件
#in runtest.jl
using Base.Test
using TestModule
然后我尝试测试Package,但是虽然测试通过,但我收到了错误提示:
julia> Pkg.test("TestModule")
INFO: Testing TestModule
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
INFO: TestModule tests passed
之后我安排了另一个测试用例。
julia> workspace() # new workspace
julia> typeof(TestModule) # make sure *there are no program-accessible references to `TestModule`*
ERROR: UndefVarError: TestModule not defined
julia> using TestModule
julia> finalize(TestModule)
fin # finalize method is working
julia> typeof(TestModule)
Module # make sure *there is program-accessible reference to `TestModule`*
julia> workspace() # force clear references
julia> typeof(TestModule) # check that *there are no program-accessible references*
ERROR: UndefVarError: TestModule not defined
根据以上测试案例,我有一些问题:
为什么为
TestModule
添加这样的finalize
方法会在测试过程中生成错误?为什么在清除引用时没有调用
finalize
方法?为模块添加
finalize
方法的正确方法是什么?(操作系统=Ubuntu,Julia版本=0.4.0)
编辑
正如 @Maciek 所提到的,在 workspace()
之后调用 gc()
也无济于事。
谢谢