IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[Perl] communication Inter-Processus


Sujet :

Langage Perl

  1. #1
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut [Perl] communication Inter-Processus
    J'aimerais bien écrire une application perl, disons un démon, qui possederait une hashmap, avec par exemple 3 champs, toto, titi et tata.

    Comment faire pour rendre cette map disponible pour d'autres programmes perl, et qu'un programme perl réussisse à obtenir la donnée correspondante à toto, titi ou tata en passant par le nom de la clé, par exemple &getData('titi') appelée depuis le programme distant permettrait d'obtenir le contenu de $map('titi') du démon ?

    Je ne suis peut-être pas très clair. Disons que j'aimerais réaliser une communication inter-processus en perl. Est-ce possible ? et si oui, comment ?

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Et bien pour fair ce genre de choses, je te conseille d'utiliser un pipe (solution qui fonctionne sous les systèmes Unix/Linux, MacOS et Windows qui plus est) ou même simplement un appel système...
    A partir de ton démon, tu appelles le programme perl que tu veux en lui passant ce que tu veux comme paramètre. Dans ce programme, le paramètre sera accessible dans le tableau @ARGV.

  3. #3
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Malheureusement, le démon occupe 50% de la RAM, et de nombreux process doivent être lancés. chaque process ne doit récupérer qu'une variable ou 2 de la hash stockée par le démon. Si je suis ta méthode, au bout de 2 process, j'ai déjà explosé la RAM disponible !

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Je ne comprend pas bien ce que tu veux dire... A partir de ton démon, tu lances chaque process en lui passant le paramètre nécéssaire... Exemple :
    system("C:\tonscript.pl $hash{'cle'}); va appeller le script tonscript.pl en lui passant $hash{'cle'} comme paramètre. Dans tonscript.pl, ce paramètre sera accessible par $ARGV[O]...

  5. #5
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Ah ok, je vois ce que tu veux dire, cependant, la valeur de ce paramètre peut changer en cours de route...

    D'autant que certains scripts peuvent avoir besoin d'une centaine de paramètres, donc si on utilise cette méthode, ce n'est pas véritablement gérable !

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le plus simple me semble-t-il serait d'utiliser un serveur, non ?

    (Sinon tu peux faire des tas de trucs non portables (partager la mémoire, passer des messages, etc), mais je ne vois pas trop l'intérêt par rapport à un serveur sauf si tu cherches vraiment les performances)

    --
    Jedaï

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Ok pour un serveur, mais comment faire pour gérer plusieurs connexions simultanées sans avoir à forker ? après plusieurs tests, on soupçonne fortement que le fork provoque une duplication de la mémoire, hors le démon occupant déjà 50% de la RAM, si je fork 2 ou 3 fois, ca risque d'occuper plus de mémoire que ce dont la machine dispose !

    Est-ce que je me trompe, et donc que le fork ne duplique pas l'intégralité de la mémoire occupée ? (ce serait cool )

    Et y-a-t-il une manière simple d'écrire un serveur tcp en perl ? (un module CPAN par exemple )

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    D'après ce que j'ai compris, le transit d'information sera relativement faible sur ces connexions de toute façon, chaque requête sera traité pratiquement instantanément, donc tu peux tout à fait faire un serveur à select().

    Un démon qui occupe 50% de la RAM... A quoi sert-il donc ? (si ce n'est pas indiscret)

    --
    Jedaï

  9. #9
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Est-ce que je me trompe, et donc que le fork ne duplique pas l'intégralité de la mémoire occupée ? (ce serait cool )
    Juste pour info, tu ne te trompes absolument pas. En fait, lors d'un fork, Perl clone l'interpréteur en cours pour lancer le nouveau processus. Cela permet d'assurer la portabilité sous toutes les plateformes.
    Mais de toute façon, il me semble que la fonction C fork clone aussi le processus courant.

  10. #10
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Citation Envoyé par Jedai
    D'après ce que j'ai compris, le transit d'information sera relativement faible sur ces connexions de toute façon, chaque requête sera traité pratiquement instantanément,
    Effectivement, lorsqu'une application se connectera au démon, elle récupérera certaines informations et se déconnectera aussitôt. Le problème principal vient du fait qu'il peut il y avoir plusieurs dizaines de process qui tournent simultanément, donc il y a toujours des risques de collision... Je suppose qu'il est possible de mettre en place un système de timeout pour attendre une réponse du serveur.

    donc tu peux tout à fait faire un serveur à select().
    C'est à dire ? aurais-tu un exemple ?

    Un démon qui occupe 50% de la RAM... A quoi sert-il donc ? (si ce n'est pas indiscret)
    Disons que nous gérons une quantité d'informations assez considérable (plusieurs To par jour), et qu'un certain nombre d'indicateurs sont calculés en cascade. Pour permettre de faciliter les calculs terminaux, le démon stocke les indicateurs intermédiaires, et les rend disponible...

  11. #11
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Effectivement, lorsqu'une application se connectera au démon, elle récupérera certaines informations et se déconnectera aussitôt. Le problème principal vient du fait qu'il peut il y avoir plusieurs dizaines de process qui tournent simultanément, donc il y a toujours des risques de collision... Je suppose qu'il est possible de mettre en place un système de timeout pour attendre une réponse du serveur.
    Tu n'as jamais fait de serveur je suppose ? Il n'y a pas de risque de collision avec un serveur TCP/IP, chacune des connexions est indépendante. Regarde donc du côté de module comme Net::Server, particulièrement Net::Server::Multiplex.
    Aussi, si les informations que vous avez à gérer sont au moins en partie de nature numérique, jette un coup d'oeil à PDL.

    --
    Jedaï

  12. #12
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Merci pour les liens, je vais y jeter un coup d'oeil de pas !!

    Sinon, j'ai déjà réalisé un ou deux serveurs dans d'autres langages, mais ce que j'appellais "collision" dans mon message, c'est une séquence du type

    * tentative de connexion au serveur
    * socket serveur déjà occupé, attente de libération d'une socket
    * timeout dépassé
    * connexion échouée

    qui n'arrive bien entendu que dans le cas d'un serveur monosocket, ou d'un serveur multisocket dont le nombre de socket maximal est atteint !

  13. #13
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par MarneusCalgarXP
    Merci pour les liens, je vais y jeter un coup d'oeil de pas !!

    Sinon, j'ai déjà réalisé un ou deux serveurs dans d'autres langages, mais ce que j'appellais "collision" dans mon message, c'est une séquence du type

    * tentative de connexion au serveur
    * socket serveur déjà occupé, attente de libération d'une socket
    * timeout dépassé
    * connexion échouée

    qui n'arrive bien entendu que dans le cas d'un serveur monosocket, ou d'un serveur multisocket dont le nombre de socket maximal est atteint !
    D'accord, mais vu le type de requête que tu veux faire, ce n'est pas avec quelques dizaines de processus simultanés que tu vas engorger le serveur, non ?

    --
    Jedaï

  14. #14
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    D'accord, mais donc on en revient à ma problématique initiale.
    Est-ce possible, en perl, de réaliser un serveur, avec une seule instance des données (~50% de la RAM), mais qui propose plusieurs sockets ?

  15. #15
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Comme je te l'ai déjà dit Net::Server::Multiplex est l'une des solutions. Il y a plusieurs sockets dans ce cas, simplement il n'y a pas plusieurs processus pour les servir, c'est pourquoi ce n'est adapté que si tu peux traiter chaque requête assez rapidement (tu peux avoir autant de connexions actives en même temps que tu veux par contre), mais dans ce cas c'est même plus efficace globalement que de faire du fork (évidemment je parle dans le contexte de machines normales, pas massivement parallèles).

    --
    Jedaï

  16. #16
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Ok, je ne l'avais pas compris comme ça ! Je te remercie beaucoup, je vais tenter de créer un serveur de test, et si j'ai des problèmes, je reviendrais t'embetter

Discussions similaires

  1. Communication Inter Processus
    Par pittacos dans le forum Windows
    Réponses: 3
    Dernier message: 29/07/2008, 09h50
  2. Communication inter-processus et pause()
    Par jsebfranck dans le forum POSIX
    Réponses: 10
    Dernier message: 14/02/2008, 14h52
  3. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  4. [débutant] Communication inter-processus
    Par tooney dans le forum C
    Réponses: 3
    Dernier message: 29/12/2005, 20h48
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo