在 Julia 中编写模块 finalize 方法的正确方法是什么?

编程入门 行业动态 更新时间:2024-10-27 11:16:25
本文介绍了在 Julia 中编写模块 finalize 方法的正确方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

I am trying to find the right way to use finalizers in Julia

Refer to Julia documentation:

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.

First I genetated a TestModule standard package with a TestModule.jl

#in TestModule.jl module TestModule end finalizer(TestModule,(t)->println("fin"))

and also a runtest.jl

#in runtest.jl using Base.Test using TestModule

then I tried to test Package but I received ERROR while the test was passed:

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

after that I arranged another test case

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

According to above test cases I have some questions

  • Why adding such finalize method for TestModule generates ERROR during test process?

  • Why finalize method was not called while I clear references

  • What is the right way to add finalize method for a module

    (OS=Ubuntu , Julia Version=0.4.0)

  • EDIT

    as @Maciek have mentioned, calling gc() after workspace() also, do not help.

    thanks

    解决方案

    IMHO, workspace takes no prisoners and in addition the finalizer works well only on user-defined and composite types.

    I've performed some tests. Have a look at my results:

    julia> type Foo x Foo(x) = begin obj = new(x); finalizer(obj,(o) -> println("The end.")); return obj end end julia> Foo(1) julia> workspace() julia> gc() Module the end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer") The end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")

    Another test with object defined inside module scope:

    julia> module FinMod type T x::Int end finalizer(T(1), (t) -> println("Module the end.")) end FinMod julia> FinMod FinMod julia> workspace() julia> gc() Module the end.error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")

    What about functions(first-class objects)?

    julia> function foo() println("I'm foo") end foo (generic function with 1 method) julia> finalizer(foo, (f) -> println("foo function is dead now.")) julia> foo foo (generic function with 1 method) julia> workspace() julia> foo ERROR: UndefVarError: foo not defined julia> gc() julia> #nothing happened

    So, to summarize: In my opinion workspace doesn't call finalize. The finalizer function works OK only for user-defined and composite types. It does not work for Module or Function.

    Update: I remembered that workspace rewrites previous Main module into LastMain. So even if our module is not accesible from Main it's is still alive inside LastMain scope (the same works for the function which I used above).

    更多推荐

    在 Julia 中编写模块 finalize 方法的正确方法是什么?

    本文发布于:2023-05-27 09:59:33,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/285809.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:方法   模块   正确   Julia   finalize

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!