l'utilisation de plusieurs objets io_service
J'ai mon application en ce qui écouter et traiter les messages provenant à la fois des prises internet et les sockets de domaine unix. Maintenant, j'ai besoin d'ajouter le protocole SSL pour les prises internet, j'ai été en utilisant un seul io_service
objet pour tous les sockets dans l'application. Il semble maintenant j'ai besoin d'ajouter séparés io_service
objets pour les sockets réseau et les sockets de domaine unix. Je n'ai pas de fils dans mon application et je l'utilise async_send
et async_recieve
et async_accept
pour traiter les données et les connexions. Merci de m'indiquer des exemples de l'utilisation de plusieurs io_service
objets avec async gestionnaires.
io_service
? À l'aide de plusieurs io_service
s peut être bon pour des fins d'évolutivité, mais alors vous avez besoin pour exécuter toutes les io_service
dans son propre thread (voir HTTP-2 exemple boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html)R - pouvez-vous préciser? J'ai lu quelque part que l'I/O les gestionnaires peuvent utiliser plusieurs threads. Dites-vous que chaque thread qui gère une async_read, par exemple, doit utiliser un autre io_service objet?
Bryan Non, j'ai dit le contraire: si vous utilisez plusieurs
io_service
s, vous avez l'habitude de courir chacun dans son propre thread (io_service-par CPU approche, voir l'exemple ci-dessus).Dans sa formulation actuelle, cette question n'est pas un bon ajustement pour. Il n'y aura pas une seule bonne réponse pour point de moi à certains liens. Je suggère d'édition de reformuler votre question à un problème spécifique.
Je ne comprends toujours pas ce problème que vous obtenez lors du passage de même
io_service
exemple pour les deux tcp::socket
et ssl::stream<tcp::socket>
?
OriginalL'auteur Ravikumar Tulugu | 2013-03-19
Vous devez vous connecter pour publier un commentaire.
La question a un degré d'incertitude, comme si de multiples
io_service
les objets requis. J'ai pas pu trouver quoi que ce soit dans le référence de la documentation ou de l'aperçu pour les SSL et Les Sockets de Domaine UNIX que mandat distinctio_service
objets. Peu importe, voici quelques options:Unique
io_service
:Essayez d'utiliser un seul
io_service
.Si vous n'avez pas directement de la poignée pour la
io_service
objet, mais vous avez une poignée pour un coup de pouce.Asio I/O objet, tel qu'un socket, puis une poignée à l'associéio_service
objet peut être obtenu en appelantsocket.get_io_service()
.Utiliser un thread par
io_service
:Si plusieurs
io_service
objets sont requis, puis consacrer un thread à chaqueio_service
. Cette approche est utilisée dans Boost.Asio est L'adresse HTTP du Serveur 2 exemple.Une conséquence de cette approche est que l'on peut exiger de thread de garanties de sécurité pour être réalisée par l'application. Par exemple, si
service1
etservice2
les deux ont l'achèvement des gestionnaires qui l'invoque,message_processor.process()
, puismessage_processor.process()
doit être thread-safe ou appelé un "thread-safe".Sondage
io_service
:io_service
offre non-blocage des alternatives àrun()
. Où queio_service::run()
bloquera jusqu'à ce que tout le travail est terminé,io_service::poll()
va exécuter les gestionnaires sont prêts à exécuter et ne bloquera pas. Cela permet, pour un seul thread à exécuter la boucle d'événements sur plusieursio_service
objets:Pour éviter un resserrement de l'activité de la boucle quand il n'y a pas de prêt-à-exécuter les gestionnaires, il peut être intéressant d'ajouter dans un sommeil. Sachez que ce sommeil peuvent introduire des temps de latence dans la tenue de l'ensemble des événements.
Transfert des gestionnaires d'un seul
io_service
:Une approche intéressante consiste à utiliser un
strand
de fin de transfert des gestionnaires d'un seulio_service
. Cela permet à un thread pario_service
, tout en évitant le besoin d'avoir l'application thread-les garanties de sécurité, comme tous d'achèvement des gestionnaires de poste par le biais d'un service unique, dont la boucle d'événement est seulement en cours de traitement par un seul thread.Cette approche comporte certaines conséquences:
io_service
à être enveloppé parvolet::wrap()
.io_service
s, la création d'un niveau supplémentaire de complexité. Il est important de tenir compte du cas où le secondaireio_service
n'a plus de travail, de sorte que sesrun()
de retour.Il est courant pour un asynchrones chaînes à se produire dans le même
io_service
. Ainsi, le service n'est jamais à court de travail, en tant que gestionnaire d'achèvement sera poste de travail supplémentaire sur leio_service
.D'autre part, lorsque le fil est utilisé pour transférer de travail à l'autre
io_service
, enveloppés gestionnaire est appelé à l'intérieur deservice2
, provoquant la poste le gestionnaire d'achèvement dansservice1
. Si le enveloppés gestionnaire a été le seul travail dansservice2
, puisservice2
n'a plus de travail, provoquantservce2.run()
de retour.Pour tenir compte de cela, l'exemple de code utilise une
io_service::
pourservice2
de sorte querun()
reste bloqué jusqu'à ce que dit explicitement pourstop()
.OriginalL'auteur Tanner Sansbury
Dirait que vous êtes la rédaction d'un serveur et un client. Ne sais pas si cela aide, mais je suis en utilisant ASIO pour communiquer avec 6 serveurs de mon client. Il utilise le protocole TCP/IP SSL/TSL. Vous pouvez trouver un lien vers le code ici
Vous devriez être en mesure d'utiliser un seul io_service objet avec plusieurs objets socket. Mais, si vous décidez que vous voulez vraiment avoir de multiples io_service objets, alors il devrait être assez facile à faire. Dans ma classe, le io_service objet est statique. Donc, il suffit de supprimer le mot-clé static avec la logique du constructeur qui seule crée une instance de la io_service objet. En fonction du nombre de connexions attendues pour votre serveur, vous serait probablement mieux d'utiliser un pool de threads dédiés à la gestion de socket d'e/S plutôt que de créer un thread pour chaque nouvelle connexion de socket.
OriginalL'auteur Bob Bryan