Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

516
Visualizações
ThreadPoolExecutor con Context Manager "no puede programar nuevos futuros después del cierre"

Estoy creando una clase de administrador de subprocesos que maneja la ejecución de tareas como subprocesos y pasa los resultados al siguiente paso del proceso. El flujo funciona correctamente en la primera ejecución de recibir una tarea, pero la segunda ejecución falla con el siguiente error:

 ...python3.8/concurrent/futures/thread.py", line 179, in submit raise RuntimeError('cannot schedule new futures after shutdown') RuntimeError: cannot schedule new futures after shutdown

Las tareas provienen de la entrada del usuario de Cmd.cmdloop ; por lo tanto, el script es persistente y está destinado a no cerrarse. En su lugar, run se llamará varias veces, a medida que se reciba la entrada del usuario.

Implementé un ThreadPoolExecutor para manejar la carga de trabajo y tratar de recopilar los resultados cronológicamente con concurrent.futures.as_completed para que cada elemento se procese al siguiente paso en orden de finalización.

El método de run a continuación funciona perfectamente para la primera ejecución, pero devuelve el error en la segunda ejecución de la misma tarea (que tuvo éxito durante la primera ejecución).

 def run ( self, _executor=None, _futures={}, ) -> bool : task = self.pipeline.get( ) with _executor or self.__default_executor as executor : _futures = { executor.submit ( task.target.execute, ), } for future in concurrent.futures.as_completed ( _futures, ) : print( future.result ( ) ) return True

Entonces, la idea es que cada llamada a run creará y desmantelará el executor con el contexto. Pero el error sugiere que el contexto se cerró correctamente después de la primera ejecución, y no se puede volver a abrir/recrear cuando se llama a run durante la segunda iteración... ¿a qué apunta este error? .. ¿Qué me estoy perdiendo?

Cualquier ayuda sería genial, gracias de antemano.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Su solución más fácil será usar la biblioteca de multiprocesamiento en lugar de enviar futuros y ThreadPoolExecutore con Context Manager:

 pool = ThreadPool(50) pool.starmap(test_function, zip(array1,array2...)) pool.close() pool.join()

Mientras que (array1[0] , array2[0]) serán los valores enviados a la función "test_function" en el primer subproceso, (array1[1] , array2[1]) en el segundo subproceso, y así sucesivamente.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda