Sin locking de multiprocesamiento. Conexión. ¿Escucha?

Utilizo multiprocessing.connection.Listener para la comunicación entre procesos, y funciona como un encanto para mí. Ahora realmente me encantaría que mi mainloop hiciera otra cosa entre los comandos del cliente. Desafortunadamente, listener.accept () bloquea la ejecución hasta que se establezca la conexión desde el proceso del cliente.

¿Existe una forma sencilla de administrar la verificación de no locking para el multiprocesamiento? Conexión? ¿Se acabó el tiempo? ¿O debo usar un hilo dedicado?

# Simplified code: from multiprocessing.connection import Listener def mainloop(): listener = Listener(address=(localhost, 6000), authkey=b'secret') while True: conn = listener.accept() # <--- This blocks! msg = conn.recv() print ('got message: %r' % msg) conn.close() 

No he usado el objeto de escucha por mí mismo; para esta tarea, normalmente uso multiprocessing.Queue ; Doco en el siguiente enlace:

https://docs.python.org/2/library/queue.html#Queue.Queue

Ese objeto se puede usar para enviar y recibir cualquier objeto capaz de decaparse entre procesos de Python con una API agradable; Creo que estarás más interesado en:

  • en proceso A
    • .put('some message')
  • en proceso B
    • .get_nowait() # will raise Queue.Empty if nothing is available- handle that to move on with your execution

La única limitación con esto es que deberás tener el control de ambos objetos de Proceso en algún momento para poder asignarles la cola, algo como esto:

 import time from Queue import Empty from multiprocessing import Queue, Process def receiver(q): while 1: try: message = q.get_nowait() print 'receiver got', message except Empty: print 'nothing to receive, sleeping' time.sleep(1) def sender(q): while 1: message = 'some message' q.put('some message') print 'sender sent', message time.sleep(1) some_queue = Queue() process_a = Process( target=receiver, args=(some_queue,) ) process_b = Process( target=sender, args=(some_queue,) ) process_a.start() process_b.start() print 'ctrl + c to exit' try: while 1: time.sleep(1) except KeyboardInterrupt: pass process_a.terminate() process_b.terminate() process_a.join() process_b.join() 

Las colas son agradables porque en realidad puedes tener tantos consumidores y tantos productores para el mismo objeto de cola que quieras (útil para distribuir tareas).

Debo señalar que solo llamar a .terminate() en un Proceso es de mala forma; debe usar su nuevo y shiny sistema de mensajería para transmitir un mensaje de cierre o algo por el estilo.