2013-04-17 16 views
7

sto tirando più richieste (il suo tirando uno alla volta), mi chiedevo se c'è un modo richieste tirare tutti allo stesso tempo, se ho qualcosa di simile:Ruby on Rails Più richiesta HTTP allo stesso tempo?

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

Ogni lv fa una richiesta a client. Mi chiedevo se c'è un modo per farlo in modo che possa fare la richiesta tutto insieme (insieme), invece di uno finisce la richiesta, poi passa alla richiesta successiva, e così via ...

Grazie!

risposta

10

Sì! Per un proof-of-, tenta

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] 

In pratica, si vuole impostare un po 'la gestione degli errori e riprovare impostazioni all'interno dei fili. Inoltre, potresti incontrare problemi con la sicurezza del thread nella gemma di Instagram. Se lo stai facendo su larga scala con centinaia o migliaia di richieste, potresti provare un client HTTP concorrente come Typhoeus o un client HTTP con evento come EM-HTTP-Request. Per questi, dovresti implementare manualmente il metodo tag_recent_media che si trova nella gemma di Instagram.

+0

holy moley, penso che questo abbia funzionato! hmm suppongo che dovrebbe andare bene se l'ho appena fatto in produzione, giusto? – hellomello

+2

Sì, ma probabilmente vorresti una gestione degli errori. Se si verifica un'eccezione durante uno dei thread, 'threads.each (&: join)' genererà un'eccezione. Da lì, puoi usare [Thread # status] (http://ruby-doc.org/core-2.0/Thread.html#method-i-status) per verificare quali thread hanno avuto eccezioni. Puoi anche utilizzare qualcosa come [retryable] (https://github.com/nfedyashev/retryable) all'interno dei blocchi di thread per gestire gli errori di rete. –

+0

Il tuo esempio non ha un 'thread <<' davanti a ogni 'Thread.new {...}'? –

Problemi correlati