none
Optimisation de Socket avec Parallel.ForEach RRS feed

  • Question

  • Bonjour,

    Voila je développe actuellement une petite application permettant d’effectuer des requêtes http assez consécutive sur un site.

    J’utilise actuellement les sockets trouvant l’objet HttpWebRequest un peu long.

    La class fonctionne mais je souhaite améliorer un peu les performances au niveau de la rapidité de la dite application.

    Pour cela, j’ai pensé à paralléliser le tout avec :  Parallel.ForEach() 

    Utilisant la même socket, pour éviter d’exécuter la méthode : Connect() 

    plusieurs fois, je me retrouve donc avec l’erreur suivante : « Une connexion existante a dû être fermée par l’hôte distant »

    La socket doit se marcher dessus entre le la méthode Send() et Receive() 

     

    Que me préconiser vous comme solution, en gardant le parallélisme et l’utilisation d’une seul socket ?

    Si ce n’est pas la bonne manière de procéder, que me conseillez-vous en gardant à l’esprit que les requêtes doivent s’effectuer le plus vite possible.

    Merci d'avance pour l'aide apportée.

    jeudi 21 février 2013 16:41

Réponses

  • Bonjour,

    Si votre site distant est un site PHP sur apache, il n'est pas rare que le site ne permet que 4 connections http simultanées pour une même IP.

    De ce fait, si vous envoyez 10 requêtes en même temps, les 4 premières seront traitées et vous risquez de prendre un timeout sur les 6 suivantes (d'où l'erreur que la connexion a été fermée).

    Pour n'envoyer que 4 requêtes à la fois, vous pouvez utiliser un semaphore(4,4) et faire un semaphore.waitone à chaque fois que vous passez dans la méthode appelée par votre parallel foreach en n'oubliant pas de faire un semaphore.release à chaque fois que vous quittez la méthode.

    Un très bon exemple (un peu ancien et en WPF) de l'utilisation de TPL avec semaphore et requête http a été montré pendant les techdays 2011 : http://www.microsoft.com/fr-fr/showcase/details.aspx?uuid=9890e6e0-8603-4c05-a5ae-7fe1aaf3be86

    Enfin, essayez peut être d'utiliser webapi client librarie pour vos requêtes http (package nuget) qui est fait à l'origine pour appeler des requêtes http distante d'une application asp .net web api mais qui peut s'utiliser sur n'importe quel request http : http://nuget.org/packages/Microsoft.AspNet.WebApi.Client/4.0.20710.0

    En espérant que ça vous aide.


    Mathieu Notin


    • Modifié Mathieu Notin vendredi 22 février 2013 18:46
    • Marqué comme réponse Aurel Bera mardi 26 février 2013 10:37
    vendredi 22 février 2013 18:45

Toutes les réponses