Python interprocess consulta / control

Tengo este demonio de servicio basado en Python que está haciendo una gran cantidad de IO multiplexado (selección).

Desde otra secuencia de comandos (también Python) quiero consultar a este daemon de servicio sobre el estado / información y / o controlar el procesamiento (p. Ej., Pausarlo, apagarlo, cambiar algunos parámetros, etc.).

¿Cuál es la mejor manera de enviar mensajes de control (“de ahora en adelante, procesa así?”) Y consulte los datos procesados ​​(“¿cuál fue el resultado de eso?”) Usando python?

Leí en alguna parte que las canalizaciones con nombre podrían funcionar, pero no sé mucho sobre las tuberías con nombre, especialmente en python, y si existen alternativas mejores.

Tanto el daemon de servicio en segundo plano Y la interfaz serán progtwigdos por mí, por lo que todas las opciones están abiertas 🙂

Estoy usando Linux.

Las tuberías y las tuberías con nombre son una buena solución para comunicarse entre diferentes procesos. Las tuberías funcionan como un búfer de memoria compartida, pero tienen una interfaz que imita un archivo simple en cada uno de los dos extremos. Un proceso escribe datos en un extremo de la tubería y otro lee esos datos en el otro extremo.

Las tuberías con nombre son similares a las anteriores, excepto que esta tubería en realidad está asociada con un archivo real en su computadora.

Más detalles en

En Python, los archivos de tuberías con nombre se crean con la llamada os.mkfifo

x = os.mkfifo(filename) 

En niño y padre abre esta tubería como archivo

 out = os.open(filename, os.O_WRONLY) in = open(filename, 'r') 

Escribir

 os.write(out, 'xxxx') 

Leer

 lines = in.readline( ) 

Edición: Agregar enlaces desde SO

Es posible que desee leer más sobre “IPC y Python”

La mejor manera de hacer IPC es usar la cola de mensajes en Python como se muestra a continuación.

proceso de servidor server.py (ejecute esto antes de ejecutar client.py e interact.py)

 from multiprocessing.managers import BaseManager import Queue queue1 = Queue.Queue() queue2 = Queue.Queue() class QueueManager(BaseManager): pass QueueManager.register('get_queue1', callable=lambda:queue1) QueueManager.register('get_queue2', callable=lambda:queue2) m = QueueManager(address=('', 50000), authkey='abracadabra') s = m.get_server() s.serve_forever() 

El inter-actor que es para I / O interact.py.

 from multiprocessing.managers import BaseManager import threading import sys class QueueManager(BaseManager): pass QueueManager.register('get_queue1') QueueManager.register('get_queue2') m = QueueManager(address=('localhost', 50000),authkey='abracadabra') m.connect() queue1 = m.get_queue1() queue2 = m.get_queue2() def read(): while True: sys.stdout.write(queue2.get()) def write(): while True: queue1.put(sys.stdin.readline()) threads = [] threadr = threading.Thread(target=read) threadr.start() threads.append(threadr) threadw = threading.Thread(target=write) threadw.start() threads.append(threadw) for thread in threads: thread.join() 

El progtwig cliente Client.py

 from multiprocessing.managers import BaseManager import sys import string import os class QueueManager(BaseManager): pass QueueManager.register('get_queue1') QueueManager.register('get_queue2') m = QueueManager(address=('localhost', 50000), authkey='abracadabra') m.connect() queue1 = m.get_queue1() queue2 = m.get_queue2() class RedirectOutput: def __init__(self, stdout): self.stdout = stdout def write(self, s): queue2.put(s) class RedirectInput: def __init__(self, stdin): self.stdin = stdin def readline(self): return queue1.get() # redirect standard output sys.stdout = RedirectOutput(sys.stdout) sys.stdin = RedirectInput(sys.stdin) # The test program which will take input and produce output Text=raw_input("Enter Text:") print "you have entered:",Text def x(): while True: x= raw_input("Enter 'exit' to end and some thing else to continue") print x if 'exit' in x: break x() 

Esto se puede usar para comunicarse entre dos procesos en red o en la misma máquina. Recuerde que el proceso inter-actor y servidor no terminará hasta que lo elimine manualmente.