2012-10-26 19 views
6

पर फोर्क, रूबी, एक्टिव रिकार्ड और फ़ाइल डिस्क्रिप्टर मैं समझता हूं कि जब हम एक प्रक्रिया को फोर्क करते हैं तो बच्चे की प्रक्रिया माता-पिता की खुली फ़ाइल डिस्क्रिप्टर और ऑफसेट की एक प्रति प्राप्त होती है। मैन पेज के मुताबिक यह माता-पिता द्वारा उपयोग की जाने वाली वही फाइल डिस्क्रिप्टर को संदर्भित करता है। निम्नलिखित कार्यक्रम में कि सिद्धांत के आधार परफोर्क, रूबी, एक्टिव रिकार्ड और फोर्क

 

puts "Process #{Process.pid}" 

file = File.open('sample', 'w') 

forked_pid = fork do 
    sleep(10) 
    puts "Writing to file now..." 
    file.puts("Hello World. #{Time.now}")  
end 




file.puts("Welcome to winter of my discontent #{Time.now}") 
file.close 
file = nil 
 

प्रश्न 1: काँटेदार प्रक्रिया है जो 10 सेकंड के लिए सो रहा है अपनी फ़ाइल वर्णनकर्ता खोना नहीं चाहिए और न माता पिता प्रक्रिया के रूप में फाइल करने के लिए लिखने में सक्षम हो फ़ाइल को पूरा करता है और बंद करता है और बाहर निकलता है।
प्रश्न 2: लेकिन यदि यह काम करता है तो किसी भी कारण से ActiveRecord इस परिदृश्य में अपना कनेक्शन कैसे खो देता है। यह केवल तभी काम करता है जब मैं ActiveRecord कनेक्ट पर :reconnect => true सेट करता हूं, यह वास्तव में कनेक्ट हो सकता है, जिसका अर्थ है कि इसका खोना कनेक्शन।

 

require "rubygems" 
require "redis" 
require 'active_record' 
require 'mysql2' 

connection = ActiveRecord::Base.establish_connection({ 
    :adapter => 'mysql2', 
    :username => 'root_user', 
    :password => 'Pi', 
    :host => 'localhost', 
    :database => 'list_development', 
    :socket => '/var/lib/mysql/mysql.sock' 

    }) 

class User < ActiveRecord::Base 
end 

u = User.first 

puts u.inspect 

fork do 
    sleep 3 
    puts "*" * 50 
    puts User.first.inspect 
    puts "*" * 50 

end 

puts User.first.inspect 
 

हालांकि, यह रेडिस (v2.4.8) के साथ भी सच नहीं है जो एक कांटा पर कनेक्शन खोना नहीं है। क्या यह आंतरिक रूप से एक कांटा पर फिर से कनेक्ट करने का प्रयास करता है?

यदि ऐसा है तो लेखन फ़ाइल प्रोग्राम क्यों त्रुटि नहीं फेंक रहा है।

क्या कोई यहां बता सकता है कि क्या हो रहा है। धन्यवाद

उत्तर

4

आप एक प्रक्रिया यह अन्य प्रक्रिया में मान्य रहता है में एक फ़ाइल वर्णनकर्ता बंद करते हैं, इस वजह से आपके फ़ाइल उदाहरण ठीक काम करता है है।

MySQL केस अलग है क्योंकि यह अंत में एक और प्रक्रिया के साथ एक सॉकेट है। जब आप mysql एडाप्टर पर करीब फोन (या जब एडाप्टर हो जाता है कचरा एकत्र होने वाले गहरे लाल रंग का निकास) यह वास्तव में सर्वर के लिए एक "QUIT" कमांड भेजता है कह रही है कि आप, डिस्कनेक्ट कर रहे हैं तो सर्वर सॉकेट की अपनी ओर नीचे आँसू। आम तौर पर आप वास्तव में दो प्रक्रियाओं के बीच एक MySQL कनेक्शन साझा नहीं करना चाहते हैं - आपको दो प्रक्रियाएं एक ही समय में सॉकेट का उपयोग करने की कोशिश कर रही हैं या नहीं, इसके आधार पर आपको अजीब त्रुटियां मिलेंगी।

यदि रेडिस कनेक्शन बंद करना सिर्फ सॉकेट को बंद करता है (जैसा कि "मैं दूर जा रहा हूं" संदेश भेजने के विरोध में) तो बच्चे कनेक्शन को काम करना जारी रखना चाहिए क्योंकि सॉकेट वास्तव में बंद नहीं होगा

+0

फ्रेडरिक के उत्तर के लिए धन्यवाद। सुनिश्चित नहीं हैं कि अगर यह एक मूर्खतापूर्ण सवाल है, लेकिन आप कृपया समझा सकता है आप एक "मैं दूर जा रहा हूँ" और फिर संदेश क्या मतलब है। – Sid

+0

mysql मामले में ग्राहक वास्तव में भेजता है एक "QUIT" कमांड तो सॉकेट के सर्वर अंत सॉकेट बंद कर देता है, किसी भी संबद्ध सर्वर साइड संसाधनों आदि विज्ञप्ति 'मुझे दूर जा रहा हूँ' मैं सिर्फ एक आदेश मतलब एक ग्राहक को भेज सकते हैं इससे सर्वर ऐसा करने का कारण बन जाएगा। –

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