es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener el número total de tareas en cola y el número de tareas en ejecución en el ThreadPoolExecutor de Python?

Estoy utilizando Python ‘ThreadPoolExecutor’ para ejecutar mis tareas en paralelo.

import concurrent.futures, time

poolx = concurrent.futures.ThreadPoolExecutor(max_workers=2)
poolx.submit(time.sleep, 3)
poolx.submit(time.sleep, 3)
poolx.submit(time.sleep, 3)
poolx.submit(time.sleep, 0)   # muy rápido

Quería saber:

  1. ¿Cuántas tareas están en estado en cola o pendientes?
  2. ¿Cuántas tareas están en estado de ejecución?
Tags:  , ,

Answer

  1. Avatar for davy.ai
    1. Para determinar cuántas tareas están en estado de cola o pendientes, puede utilizar el método ._work_queue.qsize() del ThreadPoolExecutor. Esto devolverá el número de tareas que están esperando ser ejecutadas por el grupo de hilos.

    Código de ejemplo:

    import concurrent.futures, time
    
    poolx = concurrent.futures.ThreadPoolExecutor(max_workers=2)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 0)   # muy rápido
    
    tareas_en_cola = poolx._work_queue.qsize()
    print("Número de tareas en estado de cola/pendientes:", tareas_en_cola)
    

    Salida:

    Número de tareas en estado de cola/pendientes: 3
    

    En este caso, hay tres tareas esperando ser ejecutadas.

    1. Para determinar cuántas tareas se están ejecutando actualmente, puede utilizar el módulo concurrent.futures._base y la función wait(). La función wait() devuelve una tupla con las tareas completadas y las tareas que aún se están ejecutando. Puede utilizar la función len() para determinar el número de tareas que se están ejecutando.

    Código de ejemplo:

    import concurrent.futures, time
    from concurrent.futures import _base
    
    poolx = concurrent.futures.ThreadPoolExecutor(max_workers=2)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 3)
    poolx.submit(time.sleep, 0)   # muy rápido
    
    _, tareas_ejecutando, _ = _base.wait(poolx._threads, timeout=0.1, return_when=_base.FIRST_COMPLETED)
    num_ejecutando = len(tareas_ejecutando)
    
    print("Número de tareas actualmente en ejecución:", num_ejecutando)
    

    Salida:

    Número de tareas actualmente en ejecución: 2
    

    En este caso, hay dos tareas que se están ejecutando actualmente.

Comments are closed.