2010-06-30 7 views
0

J'envoie une très grande chaîne d'une application à une autre sur localhost en utilisant des sockets en python. Les petites cordes bougent instantanément, mais les grosses cordes semblent prendre un peu plus de temps (je dis large, mais je parle peut-être d'un MB ou deux tout au plus). Assez que je doive m'asseoir et attendre quelques secondes après que je fasse quelque chose dans une application avant qu'elle n'apparaisse dans une autre.Goulot d'étranglement localhost avec sockets python

Quels sont les goulots d'étranglement ici? Si je comprends bien, avec les sockets sur 127.0.0.1, tout ce que je fais vraiment est de déplacer des données d'un point dans la mémoire à l'autre. Donc transférer même des centaines de Mo à la fois devrait se déplacer perceptivement instantanément sur mon poste de travail.

+0

est-ce que c'est lent? fournissez les repères et votre code de test afin que nous puissions reproduire vos résultats et identifier les goulots d'étranglement. – nosklo

+0

Il devrait être possible de donner un court exemple de ce que vous essayez de faire. Avoir des possibilités de copier-coller me rend au moins plus enclin à l'essayer et à voir ce qui se passe. –

+0

Faites-vous un seul 'send (2)' avec un énorme tampon? Boîte simple/multi-core? –

Répondre

3

Vous déplacez toujours les données à travers la totalité de la pile réseau, sans passer par la carte d'interface réseau elle-même.

Il peut y avoir des raccourcis autour de la pile réseau avec localhost, mais cela dépend probablement de la façon dont la pile est implémentée sur le système que vous utilisez. Peu importe la mémoire partagée ou les tuyaux seront beaucoup plus rapides.

Voici un aperçu de haut niveau: http://docs.python.org/howto/sockets.html

PS: Je ne sais pas si cela fonctionnera pour votre cas, mais le module de multitraitement a un d'une manière efficace des façons de partager des données entre plusieurs processus. PPS: Vous pouvez essayer d'utiliser un socket UDP au lieu d'un socket TCP. Cela pourrait potentiellement vous donner un meilleur débit et ne pas changer radicalement votre méthode IPC.

+0

Serait-il donc logique de compresser la corde avant de l'envoyer dans la douille et de la dégonfler de l'autre côté? – directedition

+0

Sockets, d'autre part, sont très flexibles quand il est temps de déployer les applications. C'est un effort majeur de codage pour répartir deux processus en passant par la mémoire partagée sur deux boîtes. Avec les douilles - c'est un changement de paramètre. C'est toujours un compromis. –

+0

@directedition: Non. La compression est susceptible d'être beaucoup plus lente que le gain. – nosklo

Questions connexes