DEV Community

Yoandy Rodriguez Martinez
Yoandy Rodriguez Martinez

Posted on • Originally published at yorodm.github.io on

3 1

Cola de tareas en Python (I)

Después de unos meses trabajando en Go se llegan a extrañar las abstracciones del lenguaje para concurrencia. Hoy por ejemplo necesitaba hacer una cola de tareas en Python utilizando AsyncIO. En Go esto sigue una estructura sencilla:

// Este es la gorutina que procesa los trabajos
func worker(jobChan <-chan Job) {
    for job := range jobChan {
        process(job)
    }
}
// Creamos un canal a donde enviar los datos
jobChan := make(chan Job, 10)
// Arrancamos la gorutina
go worker(jobChan)
// Enviamos datos para un trabajo, esto puede ser desde cualquier
// gorutina
jobChan <- job
//Indicamos que ya no vamos a procesar más datos
close(jobChan)
Enter fullscreen mode Exit fullscreen mode

Veamos si podemos lograr un equivalente en Python:

# Primer intento
import asyncio
async def worker(queue):
    while True:
        process(await queue.get())
        # indicamos que se procesó el trabajo
        queue.task_done()

# Creamos la cola de mensajes
queue = asyncio.Queue(10)
# arrancamos el worker
worker_task = asyncio.create_task(worker(queue))
# Enviamos mensajes a la cola
await queue.put(x)
Enter fullscreen mode Exit fullscreen mode

Hasta acá todo parece bien, pero: ¿Cómo indicamos que no se van a procesar más datos?

En Go la operación close sobre un canal hace que el ciclo termine después de procesar cualquier elemento pendiente. En Python a primera vista podemos cancelar la tarea creada enworker_task pero eso nos deja con la posibilidad de que varias tareas se queden en la cola. Por otro lado, la corutina join() de asyncio.Queue nos permite esperar a que ya no existan elementos en la cola, aunque no garantiza que worker se detenga.

La solución es utilizar una mezcla de los dos:

await queue.join() # Esperar a que se procesen los pendientes
worker_task.cancel() # Cancelar la tarea
Enter fullscreen mode Exit fullscreen mode

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay