De faire plusieurs requêtes HTTP de manière asynchrone
require 'net/http'
urls = [
{'link' => 'http://www.google.com/'},
{'link' => 'http://www.yandex.ru/'},
{'link' => 'http://www.baidu.com/'}
]
urls.each do |u|
u['content'] = Net::HTTP.get( URI.parse(u['link']) )
end
print urls
Ce code fonctionne en synchronisation style. Première, deuxième, troisième. Je voudrais envoyer toutes les demandes de manière asynchrone et d'impression urls
après tout est.
Quelle est la meilleure façon de le faire? Est la Fibre adapté pour cela?
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Voici un exemple d'utilisation des threads.
Vous pouvez utiliser
Timeout.timeotu(20) do .... end
. Cela soulève une erreur, cependant, de sorte que vous aurez besoin de faire quelque chose avec le flux de votre programme, et ont une façon de marquer qu'une demande a été terminé autres que de vérifier si lecontent
clé existe.Est Ruby Net::HTTP thread-safe?
OriginalL'auteur
Je viens de voir ce, un an et un peu plus tard, mais j'espère pas trop tard pour certains googleurs...
Typhoeus de loin la meilleure solution pour cela. Il s'enroule libcurl dans un très élégant de la mode. Vous pouvez définir la
max_concurrency
jusqu'à environ 200 sans qu'il s'étouffe.Avec le respect de délais d'attente, si vous passez Typhoeus un
:timeout
drapeau, il suffit de s'inscrire à un délai d'attente comme la réponse... et puis vous pouvez même mettre la demande de retour dans une autre hydra pour essayer à nouveau si vous le souhaitez.Voici votre programme réécrit avec Typhoeus. Espérons que cela aide quelqu'un qui vient sur cette page plus tard!
OriginalL'auteur
J'ai écrit en profondeur blog post sur ce sujet qui comprend une réponse qui est un peu similaire à celui d'août posté - mais avec quelques différences:
1) Garde une trace de tous les threads les références au "fil" de la matrice.
2) Utilise le "rejoindre" méthode pour attacher les fils à la fin du programme.
Le tutoriel complet (et quelques renseignements sur le rendement) est disponible ici: https://zachalam.com/performing-multiple-http-requests-asynchronously-in-ruby/
OriginalL'auteur
Cela peut être fait avec la bibliothèque C cURL. Un ruby liaison pour cette bibliothèque existe, mais il ne semble pas en charge cette fonctionnalité de la boîte. Cependant, il semble qu'il y est un patch ajout/de fixation (exemple de code est disponible sur la page). Je sais que ce n'est pas grand, mais il pourrait être la peine d'essayer si il n'y a pas de meilleures suggestions.
OriginalL'auteur
Cela dépend de ce que vous voulez faire après la fonction par la suite. Vous pouvez le faire avec de simples fils:
voir: http://snipplr.com/view/3966/simple-example-of-threading-in-ruby/
OriginalL'auteur
Vous pourriez avoir un thread différent exécuter chacun de le Net::HTTP.obtenir. Et juste attendre que tous les fils à la fin.
BTW impression url d'impression à la fois le lien et le contenu.
OriginalL'auteur
La work_queue gem est le moyen le plus facile pour effectuer des tâches de manière asynchrone et en même temps dans votre application.
OriginalL'auteur