2009-03-24 9 views
8

¿Hay alguna sintaxis incorporada en python que me permita publicar un mensaje a un subproceso específico de python dentro de mi problema? Como 'señal conectada en cola' en pyQt o :: PostMessage() en Windows. Necesito esto para la comunicación asíncrona entre las partes del programa: hay una serie de subprocesos que manejan eventos de red y necesitan publicar estos eventos en un solo subproceso 'lógico' que traduce los eventos de forma segura de un solo subproceso.¿Hay algún evento cross-thread integrado en python?

Respuesta

10

El módulo Queue es adecuado para lo que está describiendo.

Puede tener una configuración de cola compartida entre todos sus hilos. Los hilos que manejan los eventos de red pueden usar queue.put para publicar eventos en la cola. El hilo lógico usaría queue.get para recuperar eventos de la cola.

import Queue 
# maxsize of 0 means that we can put an unlimited number of events 
# on the queue 
q = Queue.Queue(maxsize=0) 

def network_thread(): 
    while True: 
     e = get_network_event() 
     q.put(e) 

def logic_thread(): 
    while True: 
     # This will wait until there are events to process 
     e = q.get() 
     process_event(e) 
+0

¡Gracias! ¿Hay alguna manera de poner una llamada de función dentro de un evento? Las funciones de llamada de código de subprocesos reales, como PostConnectionStatus (ESTADO), y el subproceso de trabajo tienen controladores como OnConnectionStatus (i_status). ¿Hay alguna forma de controlar las llamadas de función automáticamente con un evento? – grigoryvp

+0

En Python, las funciones son objetos como todo lo demás, por lo que se pueden pasar como otros objetos. De modo que también podría adjuntar una función para llamar con el evento, como q.put ((e, PostConnectionStatus)). Su hilo lógico podría hacer "e, func = q.get()". ¿Esto ayuda? –

+0

algo seguro, gracias. El número variable de argumentos puede organizarse de la misma manera? – grigoryvp

1

No estoy seguro de lo que está buscando. Pero ciertamente no hay una sintaxis incorporada para eso. Eche un vistazo a los módulos queue y threading. Hay muchas cosas útiles como colas, condiciones, eventos, bloqueos y semáforos que se pueden utilizar para implementar todo tipo de comunicaciones síncronas y asíncronas.

+0

estoy buscando una manera fácil de llamar a una función en un hilo y se llamará a la función vinculada en otro hilo (delegado en cola). Las primitivas de sincronización forzarán a hacerlo todo 'a mano', eso es mucho código. – grigoryvp

+1

@Eye of Hell: Lea la documentación del módulo de cola. Lo que parece ser "invocar una función" entre hilos suele ser una cola de solicitudes pasadas de un hilo a otro; el hilo de recepción dequeues la solicitud y llama a la función. –

+0

ah, recuerdo, ¿la función es un objeto de primera clase en python? (delegados incorporados). ¿Hay alguna sintaxis conocida para poner una 'llamada de función' en la cola y hacer una llamada real en dequeue en el hilo real? ¿Y qué hay de los argumentos de las funciones de clasificación? – grigoryvp

Cuestiones relacionadas