2015-10-25 6 views
6

मैं सही तरीके से जूलियाजूलिया में मॉड्यूल को अंतिम रूप देने के लिए सही तरीका क्या है?

में finalizers उपयोग करने के लिए

जूलिया दस्तावेज़ीकरण देखें खोजने की कोशिश कर रहा हूँ:

finalizer (एक्स, समारोह)

रजिस्टर एक समारोह f (x) के लिए जब एक्स के लिए कोई प्रोग्राम-सुलभ संदर्भ नहीं है तो बुलाया जाए। यदि एक्स बिट्स प्रकार का है तो इस फ़ंक्शन का व्यवहार अप्रत्याशित है।

सबसे पहले मैं एक TestModule.jl

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

और यह भी एक runtest.jl के साथ एक TestModule मानक पैकेज genetated

#in runtest.jl 
using Base.Test 
using TestModule 

तो मैं पैकेज का परीक्षण करने की कोशिश की, लेकिन मैं त्रुटि प्राप्त करते हुए परीक्षण पास किया गया था:

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 

व्यवस्था की ऊपर परीक्षण मामलों के अनुसार मैं कुछ सवाल

  1. है क्यों TestModule के लिए इस तरह के finalize विधि जोड़ने परीक्षण प्रक्रिया के दौरान त्रुटि उत्पन्न करता है?
  2. क्यों finalize विधि आमंत्रित नहीं किया गया, जबकि मैं स्पष्ट संदर्भ
  3. क्या सही तरीके से एक मॉड्यूल

    (ओएस = उबंटू, जूलिया संस्करण = 0.4.0)

के लिए finalize विधि जोड़ने के लिए है

संपादित

@Maciek के रूप में उल्लेख किया है, gc()workspace() भी बाद बुला, मदद नहीं करते।

धन्यवाद

उत्तर

1

IMHO, workspace कोई कैदियों लेता है और इसके अलावा में finalizer केवल उपयोगकर्ता परिभाषित और समग्र प्रकार पर अच्छी तरह से काम करता है।

मैंने कुछ परीक्षण किए हैं।

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") 

मॉड्यूल गुंजाइश अंदर परिभाषित वस्तु के साथ एक और परीक्षण: अपने परिणामों पर एक नजर डालें

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") 

क्या कार्य (प्रथम श्रेणी वस्तुओं) के बारे में?

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 

तो, संक्षेप में प्रस्तुत करने के लिए: मेरी राय workspace में finalize फोन नहीं करता है।finalizer फ़ंक्शन केवल उपयोगकर्ता द्वारा परिभाषित और समग्र प्रकार के लिए ठीक काम करता है। यह Module या Function के लिए काम नहीं करता है।

अद्यतन: मुझे याद है कि workspaceLastMain में पिछले Main मॉड्यूल का पुनर्लेखन। तो यहां तक ​​कि यदि हमारा मॉड्यूल Main से एक्सेसिबल नहीं है, तो यह अभी भी LastMain स्कोप के अंदर जीवित है (फ़ंक्शन के लिए वही काम जो मैंने ऊपर उपयोग किया था)।

संबंधित मुद्दे

 संबंधित मुद्दे