के माध्यम से रूबी में सॉकेट टाइमआउट सेट करें, मैं एसओ_आरसीवीटीएमई सॉकेट विकल्प के माध्यम से रूबी में सॉकेट टाइमआउट बनाने की कोशिश कर रहा हूं, हालांकि ऐसा लगता है कि यह किसी भी हालिया * निक्स ऑपरेटिंग सिस्टम पर कोई प्रभाव नहीं पड़ता है।रूबी में SO_RCVTIMEO सॉकेट विकल्प
रूबी के टाइमआउट मॉड्यूल का उपयोग करना एक विकल्प नहीं है क्योंकि इसे प्रत्येक टाइमआउट के लिए स्पॉन्गिंग और थ्रेड में शामिल होने की आवश्यकता होती है जो महंगा हो सकता है। उन अनुप्रयोगों में जिनके लिए कम सॉकेट टाइमआउट की आवश्यकता होती है और जिनमें बड़ी संख्या में धागे होते हैं, यह अनिवार्य रूप से प्रदर्शन को मारता है। यह Stack Overflow सहित कई स्थानों पर उल्लेख किया गया है।
मुझे लगता है कि एक अनुरोध भेजा समय की राशि प्राप्त होगा इंतजार एक TCP सर्वर का एक सरल उदाहरण बनाया विषय here पर और runnable कोड में से एक फाइल करने के लिए समस्या को कम करने के प्रयास में माइक Perham उत्तम पोस्ट पढ़ा है अनुरोध में और फिर कनेक्शन बंद करें।
क्लाइंट सॉकेट बनाता है, प्राप्त समय समाप्ति 1 सेकंड होने के लिए सेट करता है, और उसके बाद सर्वर से कनेक्ट होता है। क्लाइंट सर्वर को 5 सेकंड के बाद सत्र बंद करने के लिए कहता है तो डेटा के लिए इंतजार कर रहा है।
ग्राहक एक दूसरे लेकिन इसके बजाय सफलतापूर्वक के बाद 5.
#!/usr/bin/env ruby
require 'socket'
def timeout
sock = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
# Timeout set to 1 second
timeval = [1, 0].pack("l_2")
sock.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, timeval
# Connect and tell the server to wait 5 seconds
sock.connect(Socket.pack_sockaddr_in(1234, '127.0.0.1'))
sock.write("5\n")
# Wait for data to be sent back
begin
result = sock.recvfrom(1024)
puts "session closed"
rescue Errno::EAGAIN
puts "timed out!"
end
end
Thread.new do
server = TCPServer.new(nil, 1234)
while (session = server.accept)
request = session.gets
sleep request.to_i
session.close
end
end
timeout
मैं भी (जो स्वचालित रूप से जोड़ता है) एक TCPSocket साथ ही बात कर की कोशिश की है कनेक्शन बंद कर देता है और देखा है समान कोड के बाद का समय-समाप्त करना चाहिए redis और अन्य परियोजनाओं में।
साथ ही, इस बात की पुष्टि कर सकते हैं getsockopt
इस तरह फोन करके उस विकल्प को निर्धारित किया गया है:
sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_RCVTIMEO).inspect
की स्थापना करता है इस सॉकेट विकल्प वास्तव में किसी के लिए भी काम करते हैं?
प्रश्न इस प्रकार का कर दिया गया है पहले पोस्ट किया गया था, और ऐसा लगता है कि 'आरईवीवी कॉल' के आस-पास रुबी की 'टाइमआउट' लाइब्रेरी का उपयोग करना सबसे अच्छा जवाब था। – Linuxios
नहीं, टाइमआउट लाइब्रेरी स्पॉन्स थ्रेड का उपयोग करके, प्रत्येक टाइमआउट को थ्रेड बनाने और नष्ट करने की आवश्यकता होती है जो बहुत महंगा हो सकता है। यह जवाब देने के लिए मेरा जवाब अपडेट करेगा कि यह कुशल नहीं है। –