मैं एक RabbitMQ कतार और प्रत्येक के संदेश प्राप्त कर रहा हूंसंदेश एक URL है जिसे मैं अनुरोध करना चाहता हूं। अब मैं कतार में सदस्यता लेने के लिए AMQP रत्न का उपयोग कर रहा हूं और वह EventMachine का उपयोग करता है, इसलिए मैं http-अनुरोध करने के लिए em-http-request-पुस्तकालय का उपयोग कर रहा हूं। यहाँ प्रलेखन के अनुसार: https://github.com/igrigorik/em-http-request/wiki/Parallel-Requests निम्नलिखित अतुल्यकालिक http- अनुरोध जारी करेगा:
EventMachine.run {
http1 = EventMachine::HttpRequest.new("http://google.com/").get
http2 = EventMachine::HttpRequest.new("http://yahoo.com/").get
http1.callback { }
http2.callback { }
end
इसलिए जब मैं RabbitMQ कतार की सदस्यता लेता हूं तो मेरे पास निम्नलिखित कोड होते हैं:
x = 0
EventMachine.run do
connection = AMQP.connect(:host => "127.0.0.1")
channel = AMQP::Channel.new(connection)
channel.prefetch(50)
queue = channel.queue("http.requests")
exchange = channel.direct("")
queue.subscribe do |metadata, payload|
url = payload.inspect
eval "
@http#{x} = EventMachine::HttpRequest.new(url).get
@http#{x}.callback do
puts "got a response"
puts @http#{x}.response
end
x = x+1
"
end
end
यह गतिशील रूप से नए चर बनाता है औरEm-http-request प्रलेखन में वर्णित तरीके के समान नए http अनुरोध बनाता है। लेकिन क्या यह परीक्षण करने का कोई तरीका है कि क्या अनुरोध वास्तव में अतुल्यकालिक रूप से किए जा रहे हैं? क्या हर बार कंसोल पर लिखना संभव है जब एक अनुरोध को निकाल दिया जाता है, तो मैं देख सकता हूं कि उन्हें प्रतिक्रिया के लिए इंतजार किए बिना एक के बाद एक निकाल दिया जाता है?
उत्तर:
उत्तर № 1 के लिए 1आप tcpdump चलाने और आउटपुट का विश्लेषण करने का प्रयास कर सकते हैं। यदि आप देखते हैं कि दो कनेक्शनों के बीच टीसीपी तीन-तरफ़ा हैंडशेक किया जा रहा है, तो कनेक्शन समानांतर में हो रहे हैं।
यह "t वास्तव में एक स्वचालित परीक्षण का हिस्सा हो सकता हैहालांकि, अगर वह "क्या आप" के लिए लक्ष्य करने की कोशिश कर रहा है। मुझे बस यह सत्यापित करने में खुशी होगी कि पुस्तकालय वह करता है जो यह कहता है कि यह एक बार करता है और इसे टेस्ट सूट का हिस्सा नहीं बनाता है।
जवाब के लिए 0 № 2
एक बहुत ही सरल उदाहरण, जो आप चाहते हैं, वही प्रदर्शित करना:
require "em-http-request"
EM.run do
# http://catnap.herokuapp.com/3 delays the HTTP response by 3 seconds.
http1 = EventMachine::HttpRequest.new("http://catnap.herokuapp.com/3").get
http1.callback { puts "callback 1" }
http1
puts "fired 1"
http2 = EventMachine::HttpRequest.new("https://www.google.com/").get
http2.callback { puts "callback 2" }
puts "fired 2"
end
आउटपुट (मेरे लिए):
fired 1
fired 2
callback 2
callback 1
आपके इंटरनेट कनेक्शन, हरोकू और Google के आधार पर, दूसरे HTTP अनुरोध की प्रतिक्रिया संभवतः पहले आ जाएगी और आप सुनिश्चित हो सकते हैं, अनुरोध वास्तव में समानांतर में किए गए हैं।