URL: https://linuxfr.org/forums/programmation-python/posts/communication-inter-processus-330b382e-e2bc-4b10-a185-b46c2f7d22a5 Title: Communication inter-processus Authors: Marotte ⛧ Date: 2017年01月21日T22:09:27+01:00 License: CC By-SA Tags: python, python3, subprocess et signal Score: 1 Bonjour, Je dois disposer d’un moyen de communiquer entre plusieurs processus. Typiquement entre un processus client interactif et un processus serveur en tâche de fond. Le process client doit pouvoir non seulement envoyer les signaux standards (SIGINT, SIGTERM, etc...) mais aussi n’importe quel "message". Avant d’essayer d’ajouter du code à mon projet j’ai fait un petit test afin de bien cerner le problème. Je suis arrivé à la solution suivante, que je soumets à votre sagacité... Est-ce la bonne manière de faire. Comment procédez-vous vous même pour répondre à cette problématique ? Je m’interroge aussi sur les constantes que j’ai choisies (65535 et 0.5), que j’interprète comme étant la taille maximum de mon "message" et le temps laissé pour la lecture du FIFO... Si je ne mets pas ce délai, cela résulte en un nombre de fichiers ouverts trop important (et ça plante, normal), vu que ça ouvre un autre fichier sans avoir eu le temps de finir de lire le premier... J’ai pourtant besoin d’être en "non-blocking" si je veux passer à la suite... Ces valeurs vous semblent correctes ? ```python #!/usr/bin/env python3 import sys import subprocess import signal import os from time import sleep pidFilename = '/tmp/'+sys.argv[0]+'.pid' fifoFilename = '/tmp/'+sys.argv[0]+'.fifo' def graceful_exit(signum, frame): print('I terminate, my PID is '+str(os.getpid())+' and I received signal '+str(signum)+'', file=sys.stderr, flush=True) sys.exit(0) try: if sys.argv[1] == 'start': try: os.unlink(fifoFilename) except FileNotFoundError: pass sleeper = subprocess.Popen(['./'+sys.argv[0], 'run'], stdin=subprocess.PIPE, shell=False) pidfile = open(pidFilename,'w') _pid = str(sleeper.pid) pidfile.write(_pid) pidfile.close() elif sys.argv[1] == 'run': signal.signal(signal.SIGTERM, graceful_exit) signal.signal(signal.SIGINT, graceful_exit) fifo = os.mkfifo(fifoFilename) while True: _message = os.read(os.open(fifoFilename, os.O_NONBLOCK | os.O_RDONLY), 65535).decode('UTF-8') if _message: print('I’m alive, my PID is '+str(os.getpid())+' and I’ve been told to say : « '+_message+' »', file=sys.stderr, flush=True) sleep(0.5) elif sys.argv[1] == 'stop': pidfile = open(pidFilename,'r') os.kill(int(pidfile.read()), signal.SIGTERM) os.unlink(fifoFilename) pidfile.close() os.unlink(pidFilename) elif sys.argv[1] == 'say' and len(sys.argv)> 1: open(fifoFilename, 'w').write(sys.argv[2]) except IndexError as e: print(str(e), file=sys.stderr) ``` Le script s’utilise ainsi : ```./sp.py start``` démarre le "serveur" ```./sp.py say ``` fait écrire au "serveur" sur la sortie d’erreur ```./sp.py stop``` arrête le serveur. Voilà, vous en pensez quoi ?

AltStyle によって変換されたページ (->オリジナル) /