2009-12-06 6 views
3

Je travaille sur l'écriture d'un client Python pour les réseaux P2P Direct Connect. Essentiellement, cela fonctionne en se connectant à un serveur central et en répondant aux autres utilisateurs qui recherchent des fichiers. De temps en temps, un autre client nous demandera de se connecter à eux, et ils pourraient commencer à télécharger un fichier de notre part. Ceci est une connexion directe à l'autre client, et ne passe pas par le serveur central.Façon correcte d'implémenter un client Direct Connect dans Twisted?

Quelle est la meilleure façon de gérer ces connexions à d'autres clients? J'utilise actuellement un réacteur Twisted pour me connecter au serveur, mais vaut-il mieux avoir plusieurs réacteurs, un par client, avec chacun fonctionnant dans un thread différent? Ou serait-il préférable d'avoir un script Python complètement séparé qui effectue la connexion au client?

S'il y a une autre solution que je ne connais pas, j'aimerais l'entendre. Je suis nouveau à la programmation avec Twisted, donc je suis ouvert aux suggestions et autres ressources.

Merci!

Répondre

3

Sans connaître tous les détails du protocole, je voudrais encore vous recommandons d'utiliser un seul réacteur - un réacteur échelles bien tout à fait (en particulier ceux avancés tels que PollReactor) et de cette façon, vous éviterez les frais généraux liés à fils (c'est ainsi que Twisted et les autres systèmes asynchrones obtiennent un boost de performance fondamental, après tout - en évitant de tels frais généraux. En pratique, les threads dans Twisted sont surtout utiles lorsque vous avez besoin d'interfacer avec une bibliothèque dont les fonctions pourraient vous bloquer.

+0

Ceci est très utile, merci! Cependant, comment un seul réacteur gérerait-il la lente écriture en réseau? Pour transférer un fichier, même en très petits morceaux comme 4 Mo, il faut du temps pour transmettre ces données à l'autre client. Est-il possible de faire en sorte que la méthode transport.write() ne bloque pas le reste du programme? – Alex

+0

Un vrai 'transport.write' dans Twisted ne bloquera pas: il écrira ce qu'il peut et gardera le reste pour la prochaine fois que d'autres données pourront être écrites! ('writeSequence' est aussi souvent utile, mais aussi non-bloquant). –

+0

Par exemple, voir la source de twisted.internet.abstract.FileDescriptor.write, à http://twistedmatrix.com/trac/browser/trunk/twisted/internet/abstract.py - de nombreuses classes de transport en héritent et leurs ' Les méthodes write 'y délèguent finalement - chaque classe implémente alors 'writeSomeData' pour écrire des octets sans bloquer, quand c'est possible (ça s'appelle' doWrite'), et retourne le nombre d'octets écrits. –

Questions connexes