2012-08-17 11 views
14

tengo una tarea, algo como esto:programación de la tarea de apio (Asegurar una tarea se ejecuta sólo uno a la vez)

@task() 
def async_work(info): 
    ... 

En cualquier momento, puede llamar async_work con algo de información. Por alguna razón, lo que necesito es asegurarme de que solo se está ejecutando una async_work a la vez, otra solicitud de llamada debe esperar.

Así que vengo con el siguiente código:

is_locked = False  
@task() 
    def async_work(info): 
     while is_locked: 
      pass 
     is_locked = True 
     ... 
     is_locked = False 

Pero dice que es válido para acceder a las variables locales ... ¿Cómo se puede solucionar?

+0

¿Se puede publicar el mensaje de error exacto? –

Respuesta

21

No es válido acceder a las variables locales ya que puede tener varios trabajadores de apio ejecutando tareas. Y esos trabajadores incluso podrían estar en diferentes hosts. Entonces, básicamente, hay tantas instancias variables is_locked como muchos trabajadores de Apio ejecutan su tarea async_work. Por lo tanto, aunque su código no genere ningún error, no obtendrá el efecto deseado.

Para lograr su objetivo, necesita configurar Apio para ejecutar solo un trabajador. Como cualquier trabajador puede procesar una sola tarea en un momento dado, obtiene lo que necesita.

EDIT:

Según Workers Guide > Concurrency:

Por multiprocesamiento por defecto se utiliza para llevar a cabo la ejecución simultánea de tareas , pero también se puede utilizar Eventlet. La cantidad de procesos/hilos de los trabajadores se puede cambiar usando el argumento --concurrency y el valor predeterminado es la cantidad de CPU disponibles en la máquina.

Por lo tanto es necesario ejecutar el trabajador así:

$ celery worker --concurrency=1 

EDIT 2:

Sorprendentemente hay otra solución, por otra parte, se incluso en los documentos oficiales, vea el artículo Ensuring a task is only executed one at a time .

+0

¿Podría explicarlo más explícitamente? ¿Cómo configurar a Apio para ejecutar solo un trabajador? –

+0

"$ apio trabajador --concurrencia = 1" ¡Eso funcionó bien! Gracias de hecho. –

Cuestiones relacionadas