Question

J'essaie d'ajouter un nouveau transport à Twisted, qui lira les données d'un flux - soit un fichier de manière tail -f , soit à partir d'un tube, mais j'ai des problèmes. avec architecture Twisted.

J'ai le transport lui-même (implémente ITransport ) - il gère toutes les ouvertures de fichiers. J'ai des fonctions de streaming / différées prêtes. Comment puis-je le mettre ensemble maintenant? J'aimerais signaler les nouvelles données à dataReceived () du protocole.

Je pourrais bien sûr créer un nouvel objet qui configurera les moniteurs d’entrée / sortie avec les rappels appropriés, enregistrera un rappel lors de l’arrêt du réacteur (pour fermer les fichiers / protocoles) et tout démarrer manuellement - mais est-ce bien " dans le bon sens " ;? Y at-il une abstraction plus agréable que je pourrais utiliser? J'ai vu réacteur.connectWith () , mais cela ne fournit pas vraiment beaucoup d'abstraction ...

Aussi - comment suis-je censé transmettre les données de mon lecteur au protocole? ITransport ne définit aucune interface pour cela, même si cela semble être la responsabilité du transport.

Était-ce utile?

La solution

On dirait que vous avez surtout compris comment faire cela. Vous pourriez être intéressé par twisted.internet.fdesc.readFromFD , mais il ne comporte que quelques lignes et ne fait rien de particulièrement compliqué (c’est quelques lignes que vous n’avez pas à maintenir, cependant). En dehors de cela - oui, vous devez effectuer la surveillance des E / S dans ce cas, car les descripteurs de fichiers normaux ne sont pas pris en charge par select / poll / epoll (ils sont toujours signalés comme étant prêts, pas ce que vous voulez).

Certains travaux ont été effectués sur la prise en charge d’inotify dans Twisted ( http://twistedmatrix.com/trac/ticket / 972 ), mais cela n’est pas encore terminé. Cela ne vous sera donc pas directement utile (à moins que vous ne souhaitiez nous aider à le terminer et à l’utiliser ensuite). En supposant que vous utilisiez uniquement une interrogation temporelle, une grande partie de ce qu'il y a dans le réacteur ne vous aidera pas beaucoup, car ce code est basé sur l'utilisation d'une API de préparation fournie par le système (c'est-à-dire, select / poll / epoll) pour déclencher des événements. .

Toutefois, vous devriez pouvoir utiliser et tirer parti des méthodes de IReactorFDSet - addReader et autres.

Votre transport d'interrogation basé sur le temps peut tout de même bénéficier de la mise en œuvre de ITransport - bien que je ne sois pas sûr de la manière dont vous implémenteriez write pour un tail -f -like transport. Vous aurez certainement intérêt à ce que votre transport fournisse des données via l'interface IProtocol , car cela simplifie la réutilisation du code. IProtocol.dataReceived est exactement ce que vous voulez faire pour que les données de votre lecteur (je pense que ce soit la même chose que votre transport , n'est-ce pas? ). Ce n'est pas défini sur ITransport car c'est une méthode que vous appelez sur un autre objet qui n'est pas le transport.

réacteur.connectWith ne va probablement pas vous acheter quoi que ce soit. Comme vous le dites, ce n’est pas vraiment une abstraction; Je dirais que c'est plus une erreur. :)

Ne vous inquiétez pas trop de ne pas pouvoir ajouter de méthodes directement dans le réacteur. Une fonction libre qui accepte un réacteur en tant que paramètre est tout aussi facile à utiliser.

Pour le rappel d'arrêt, addReader devrait vous rendre la majeure partie du chemin. connectionLost sera appelé sur tous les lecteurs du réacteur au moment de l'arrêt du système (composant de IFileDescriptor ). Vous devez implémenter ceci pour nettoyer les fichiers et le protocole.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top