2013-04-17 40 views
7

Tôi kéo nhiều yêu cầu (kéo của nó cùng một lúc), tôi đã tự hỏi nếu có một cách yêu cầu kéo tất cả cùng một lúc nếu tôi có một cái gì đó như thế này:Ruby on Rails Nhiều yêu cầu HTTP cùng một lúc?

client = Instagram.client(:access_token => session[:access_token]) 
@user = client.user 
@recent_media_items = client.user_recent_media 

@lv = client.tag_recent_media('lv', options = {:count => 60}) 
@lv1 = client.tag_recent_media('lv1', options = {:count => 60}) 
@lv2 = client.tag_recent_media('lv2', options = {:count => 60}) 
@lv3 = client.tag_recent_media('lv3', options = {:count => 60}) 

Mỗi lv làm cho một yêu cầu đến client. Tôi đã tự hỏi nếu có một cách để làm như vậy để nó có thể làm yêu cầu cùng một lúc (cùng nhau), thay vì một yêu cầu kết thúc, sau đó đi đến yêu cầu tiếp theo, và cứ thế ...

Cảm ơn!

Trả lời

10

Có! Để có bằng chứng về khái niệm, hãy thử

require 'thread' 

client = Instagram.client(:access_token => session[:access_token]) 
@user = client.user 
@recent_media_items = client.user_recent_media 

threads = [] 
threads << Thread.new { @lv = client.tag_recent_media('lv', options = {:count => 60}) } 
threads << Thread.new { @lv1 = client.tag_recent_media('lv1', options = {:count => 60}) } 
threads << Thread.new { @lv2 = client.tag_recent_media('lv2', options = {:count => 60}) } 
threads << Thread.new { @lv3 = client.tag_recent_media('lv3', options = {:count => 60}) } 
threads.each(&:join) # this waits for all the threads to finish before proceeding 
puts [@lv, @lv1, @lv2, @lv3] 

Thực tế, bạn sẽ muốn thiết lập một số lỗi xử lý và thử lại cài đặt trong chuỗi. Ngoài ra, bạn có thể gặp phải các vấn đề về an toàn luồng trong đá quý Instagram. Nếu bạn đang thực hiện điều này trên quy mô lớn với hàng trăm hoặc hàng nghìn yêu cầu, bạn có thể muốn thử một ứng dụng khách HTTP đồng thời như Typhoeus hoặc ứng dụng khách HTTP được kiện như EM-HTTP-Request. Đối với những điều này, bạn sẽ phải tự thực hiện phương thức tag_recent_media có trong đá quý Instagram.

+0

moley thánh, tôi nghĩ rằng cái này đã hoạt động! hmm Tôi đoán nó sẽ ổn nếu tôi chỉ làm điều này trong sản xuất phải không? – hellomello

+2

Có, nhưng có thể bạn sẽ muốn xử lý lỗi. Nếu một ngoại lệ xảy ra trong một trong các luồng, 'threads.each (&: join)' sẽ tăng một ngoại lệ. Từ đó, bạn có thể sử dụng [Thread # status] (http://ruby-doc.org/core-2.0/Thread.html#method-i-status) để kiểm tra xem các luồng nào có ngoại lệ. Bạn cũng có thể sử dụng một cái gì đó như [retryable] (https://github.com/nfedyashev/retryable) trong các khối chuỗi để xử lý các lỗi mạng. –

+0

Chẳng phải ví dụ của bạn thiếu một 'chủ đề <<' trước mỗi 'Thread.new {...}'? –

Các vấn đề liên quan