Esta pregunta puede no estar clara, de ser así, probablemente porque no estoy del todo seguro de cómo hacer la pregunta, pero aquí va:

Tengo una clase de Python desde la que me gustaría llamar a una función.

La clase no tiene acceso a los datos sobre los que debería operar la función; básicamente, me gustaría que la clase envíe un mensaje a otro proceso, que llama a la función. Algo como:

from multiprocessing import Process

class Foo():
   def bar(phonenumber):
      do_something()
      send_message(phonenumber)

def daemon(data, phonenumber):
   while nothing_receivied(phonenumber):
      do_nothin()
      also_do_not_consume_too_much_CPU()
   if message_received(phonenumber):
      function(data)

p = Process(target=daemon, args=(data, phonenumber))
p.start()
p.join()

Llamar a Foo.bar(phonenumber) debería tener el efecto adicional de que function se realiza en data. ¿Cómo se puede lograr esto?

¡Salud!

2
trolle3000 3 mar. 2012 a las 20:53
1
Consulte las colas de mensajes (y los patrones típicos de MQ) como Beanstalk o ZeroMQ (y muchos otros) para ver si se ajustan a su caso de uso
 – 
Jesvin Jose
3 mar. 2012 a las 21:00
+1 para ZeroMQ. Olvidé por completo mencionar las colas de mensajes en mi respuesta.
 – 
jdi
3 mar. 2012 a las 21:03

1 respuesta

La mejor respuesta

Si está tratando de usar específicamente el módulo multiprocessing, probablemente debería considerar el uso de una cola / tubería. http://docs.python.org/library/multiprocessing.html#pipes -y-colas

La parte del código de su demonio en la que desea sentarse y no hacer nada sin consumir demasiada CPU es el punto en el que intentaría obtener un elemento de la cola o sondear la tubería en busca de datos y bloquear hasta que algo esté listo. El otro lado de la cola o tubería simplemente colocaría datos en la cola que llena el rol de su concepto send_message.

Si desea una solución asincrónica más sólida, también debe consultar las bibliotecas Twisted: http://twistedmatrix.com/trac/

Esto le permitiría definir un servicio en un nivel superior que tiene un bucle de eventos con controladores para procesar las conexiones entrantes.

Y por último, si solo desea una solución simple en el mismo script y no en una red, puede usar fácilmente el módulo de subprocesos: http://docs.python.org/library/threading.html. Y use Queue.Queue para que el demonio se bloquee con un get(), y send_message () haciendo un put()

0
jdi 3 mar. 2012 a las 21:02