En parallèle des requêtes HTTP en ruby
J'ai un tableau d'Url et je wan pas à l'ouvrir et récupérer une balise spécifique.
Mais je veux le faire en parallèle.
Voici le pseudo-code pour ce que je veux faire:
url = [...] tags = [] les url.chaque do |url| fetch_tag_asynchronously(url) do |tag| les balises << balise fin fin wait_for_all_requests_to_finish()
Si cela pourrait être fait dans une belle et sûre, ce serait génial.
Je pourrais utiliser le thread, mais il n'a pas l'air comme des tableaux sont thread-safe en ruby.
OriginalL'auteur Nicklas A. | 2012-01-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez atteindre fil de sécurité à l'aide d'un
Mutex
:Il pourrait toutefois être contre-productif d'utiliser un nouveau thread pour chaque URL, afin de limiter le nombre de threads, comme cela pourrait être plus performant:
Si le gros du travail est de IO, le nombre de cœurs ne devrait pas vraiment d'importance, devrait-il?
C'est vrai. Pourtant, avoir trop de fils et de connexions ouvertes en même temps, peut être contre-productif. Firefox utilise une valeur par défaut de 8 connexions pour HTTP pipelining, je pense, donc je utilise maintenant ce que la valeur proposée (au lieu de 5).
c'est tellement beau Niklas !
Un autre avantage de cette approche est qu'elle maintient à l'aide de threads alors que possible, de sorte qu'il évite de création/destruction de frais généraux. Et c'est génial!
OriginalL'auteur Niklas B.
La Typhoeus/Hydra gem combinaison est conçu pour faire cela très facilement. C'est très pratique et puissant.
s'il vous plaît pouvez-vous élaborer davantage sur ce point? n'importe quelle source
Dans l'expérience précédente à l'aide de ce petit bijou dans les environnements qui utilisent des threads (comme sidekiq) les mauvaises choses se produisent. J'ai aussi trouvé ce problème github.com/typhoeus/ethon/issues/131
OriginalL'auteur the Tin Man
Grâce à ruby GIL ce devrait être à l'abri, selon ma lecture de http://merbist.com/2011/02/22/concurrency-in-ruby-explained/ et autres liens.
OriginalL'auteur ben