2013-04-17 23 views
7

ja ciągnąc wiele żądań (jej ciągnięcie po jednym na raz), zastanawiałem się, czy istnieje sposób żądania ciągnąć w tym samym czasie, jeśli mam coś takiego:Ruby on Rails Wiele żądań HTTP w tym samym czasie?

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

Każdy lv występuje z wnioskiem do client. Zastanawiam się, czy istnieje sposób, aby to zrobić, aby mogła wykonać żądanie naraz (razem), zamiast jednego kończy żądanie, a następnie przechodzi do następnej prośby, i tak dalej ...

Dzięki!

Odpowiedz

10

Tak! Dla proof-of-concept, spróbuj

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] 

W praktyce będzie chciał założyć jakąś obsługę błędów i ponowić próbę ustawienia wewnątrz wątków. Ponadto możesz natknąć się na problemy z bezpieczeństwem wątków w gemie Instagram. Jeśli robisz to na dużą skalę z setkami lub tysiącami próśb, możesz chcieć wypróbować współbieżnego klienta HTTP, takiego jak Typhoeus lub zdarzenie klienta HTTP, takiego jak EM-HTTP-Request. W tym celu trzeba ręcznie zaimplementować metodę tag_recent_media znajdującą się w klejnocie Instagrama.

+0

Święty moley, myślę, że ten działał! hmm Myślę, że powinno być dobrze, jeśli zrobiłem to po prostu w produkcji? – hellomello

+2

Tak, ale prawdopodobnie potrzebujesz obsługi błędów. Jeśli podczas jednego z wątków wystąpi wyjątek, 'threads.each (&: join)' spowoduje zgłoszenie wyjątku. Stamtąd możesz użyć [Status # Thread] (http://ruby-doc.org/core-2.0/Thread.html#method-i-status), aby sprawdzić, które wątki miały wyjątki. Możesz także użyć czegoś takiego jak [retryable] (https://github.com/nfedyashev/retryable) w blokach wątków, aby poradzić sobie z błędami w sieci. –

+0

Czy Twój przykład nie zawiera "wątków <<" przed każdym "Thread.new {...}"? –