2010-02-10 4 views
2

Je suis en train de créer un serveur monovis aync qui reçoit des données des clients. Il traite les données, puis les enregistre dans la base de données MySQL. Le problème est que l'API MySQL C ne prend pas en charge les appels non bloquants et asio n'aime pas principalement les appels bloquants. Donc je pense quelque chose comme deferToThread() de Python Twisted comme la sémantique. Y a-t-il quelqu'un qui a déjà développé une telle chose? Ou devrais-je l'implémenter?Utilisation de l'API de blocage Mysql avec Boost :: asio

+0

Il est trivial avec asio d'avoir un thread par connexion. Vouliez-vous un thread par connexion plus un thread par écriture mysql? –

+1

Je ne veux pas avoir de thread par connexion. Cela va tuer l'évolutivité du serveur. – serialx

Répondre

2

Il y avait a post à la liste de diffusion Asio au cours de l'été décrivant une classe de service asynchrone générique qui semble être utile pour vous. Ce code pseudo est de l'e-mail de l'auteur I lié:

// Create a command processor with 5 threads allocated 
// to processing the commands. 
async_command_processor processor(io_service, 5); 

// Execute the command asynchronously and call the 
// MyCommandComplete callback when completed. 
processor.async_execute(MyCommand, MyCommandComplete); 
0

pour "tirer et oublier" un fil. Vous pouvez créer une classe avec opérateur() et des variables membres avec des données à écrire. Dans le gestionnaire de données asio accept, créez l'une de ces classes, puis passez-la à un thread boost. Le thread Boost copiera cette classe en interne et démarrera le thread. Si vous faites attention à la façon dont vous écrivez l'opérateur(), il devrait se terminer lorsque l'écriture sql est terminée et libérer ses données d'écriture. Vous pouvez appeler boost :: thread :: detach pour oublier le thread et le laisser terminer puis mourir. De cette façon, vous lancez de nouveaux threads qui écrivent à mysql depuis vos gestionnaires asio. Je ne suis pas sûr de ce qu'il advient des données de membre lorsque la classe de threads est hors de portée. vérifiez les documents d'amplification, cela pourrait poser un problème si le thread d'amplification n'est pas terminé et que le thread a encore besoin de données qui ont disparu. Peut-être que les pointeurs partagés peuvent aider ici.

+0

Mais je veux rappeler le gestionnaire pour notifier que l'exécution de sql est terminée. Fondamentalement, je veux quelque chose comme async_read pour MySQL. Ou un async_call_from_other_thread_and_comeback générique – serialx

+0

Oh je vois maintenant. Ensuite, vous pouvez utiliser boost :: signals2 qui est appelé depuis le thread "déclenché", juste avant que ce thread ne se termine, et connectez-les lorsque vous créez la classe de foncteur pour le thread. J'aime comment boost est toujours la réponse. –

3

Peut-être que vous serez intéressé par cette bibliothèque client MySQL asynchrone basée Asio nommé Amy: https://github.com/liancheng/amy

Cité du README GitHub:

Amy est un en-tête conforme à la norme C++ 11 A synchrone Ma bibliothèque client basée sur Boost.Asio. Il vous permet de travailler avec MySQL de manière asynchrone et bloquante.

+0

S'il vous plaît ajouter plus d'informations ici. – hims056

+0

@ hims056 On dirait vraiment du bon code. En-tête uniquement, utilise le système de fichiers/options_programme uniquement pour les tests. Utilise le paramètre boost pour les paramètres nommés (rangé avec un espace de noms séparé pour les mots-clés named-param). Je suis tenté de l'utiliser. Revue plus tard – sehe

+0

Merci beaucoup Cheng Lian, est très belle bibliothèque. – Ramy

Questions connexes