TP5 Python avancé : Multithreading, multitraitement et sockets
Exercice 1:
La fonction incr() incrémentera jusqu'à 500000 un compteur qui sera partagé entre les processus.
def incr(compteur):
for i in range(50000):
[Link] += 1
Puisque les processus disposent de leur propre espace mémoire, ils ne peuvent pas simplement manipuler
les mêmes variables; pour qu'ils puissent partager des données, il faut le faire en utilisant des objets
spéciaux appelés Value ( valeur unique ) ou Array ( tableau ) du module multiprocessing.
1. Créer une instance de l’Objet Value qui initialise une données entière à 0 afin de le passer à la
fonction incr().
2. Créer 10 processus qui exécuteront en concurrence la fonction incr(compteur).
3. Quelle valeur aura compteur à la fin de l'exécution des 10 processus ?
4. Résoudre le problème à l’aide de verrous (Lock)
Exercice 2: Application de chat peer-to-peer
Dans cet exercice on va implémenter une application de chat utilisant des sockets UDP en Python avec
l’architecture peer to peer. Une fois que l'application de chat est en cours d'exécution, vous pouvez utiliser
les commandes suivantes pour interagir avec elle :
• /exit : Quitter l'application de chat.
• /quit : Quitter la discussion actuelle.
• /join [adresse IP] [port] : Rejoindre une discussion avec un autre utilisateur sur une adresse IP et
un port.
• /send [message] : Envoyer un message dans la discussion actuelle.
1. Ouvrir le fichier [Link] et le compléter en insérant les instructions demandées. Dans tous les cas, il
est demandé d’insérer une seule instruction (une seule ligne) par TODO.
2. Créer deux fichier python [Link] et [Link] en insérant dans chaque fichier le code suivant :
• Importation de la classe Chat
• Création d’une instance Chat avec le port 5000 et 5001
• Démarrage de l’instance avec la méthode run
3. Exécuter chaque fichier ([Link] et [Link]) dans terminal différent et commencer la discussion
entre les deux instance (voire Figure 1).
4. Quelle est l’utilité de thread qu’on a créé pour la réception des messages ?
5. Pourquoi on a utilisé le verrou lock ?
6. Optionnel : Tester l’application pour communiquer dans un réseau local (au moins deux machine
différentes)
7. Optionnel : Améliorer l’application pour qu’elle affiche le nom d’utilisateur, date de message,
acceptation de rejoindre, etc.
Figure 1: Application chat avec socket Python.
Exercice 3: Application calculatrice client/serveur
En se basant sur le code précédent, implémenter une application client/serveur en Python qui
peut calculer les opérations arithmétiques des nombres envoyés par un client.
Figure 2: Application client/serveur calculatrice.
Serveur :
Créez une classe Server avec les méthodes et fonctionnalités suivantes :
• Une méthode __init__() pour initialiser le socket du serveur.
• Une méthode _exit() pour arrêter l'application et fermer le socket.
• Une méthode _receive() pour recevoir les données du client.
• Une méthode _compute() pour calculer la somme des nombres reçus.
• Une méthode _send() pour renvoyer le résultat au client.
• Une méthode run() pour démarrer le serveur et gérer les connexions des clients.
Client :
Créez une classe Client avec les méthodes et fonctionnalités suivantes :
• Une méthode __init__() pour initialiser le socket du client.
• Une méthode _send() pour envoyer des opérations au serveur.
• Une méthode run() pour démarrer le client et envoyer des opérations au serveur.
Tâches pour le serveur :
• Le serveur doit écouter les connexions entrantes des clients.
• Il doit recevoir les données envoyées par le client.
• Il doit calculer le resultat des nombres reçus.
• Il doit renvoyer le résultat au client.
Tâches pour le client :
• Le client doit se connecter au serveur.
• Il doit envoyer des opérations (ex: "4 + 5") au serveur.
• Il doit afficher le résultat renvoyé par le serveur.
• Il doit pouvoir envoyer plusieurs opérations sans fermer la connexion.
Instructions générales :
• Utilisez les sockets pour la communication client-serveur.
• Le serveur doit être capable de gérer les erreurs et de fermer correctement les connexions.
• Testez votre code en exécutant d'abord le serveur, puis le client.
• Assurez-vous que le code est bien commenté et lisible.
• Essayez d'anticiper et de gérer les erreurs possibles lors de la communication client-serveur.