Soy nuevo en python y avanzo un poco con threading
- estoy haciendo algo de conversión de archivos de música y quiero poder utilizar los múltiples núcleos en mi máquina (un hilo de conversión activo por núcleo).¿Cómo puedo limitar el número de subprocesos activos en Python?
class EncodeThread(threading.Thread):
# this is hacked together a bit, but should give you an idea
def run(self):
decode = subprocess.Popen(["flac","--decode","--stdout",self.src],
stdout=subprocess.PIPE)
encode = subprocess.Popen(["lame","--quiet","-",self.dest],
stdin=decode.stdout)
encode.communicate()
# some other code puts these threads with various src/dest pairs in a list
for proc in threads: # `threads` is my list of `threading.Thread` objects
proc.start()
Todo funciona, todos los archivos se codifican, ¡bravo! ... sin embargo, todos los procesos aparecen inmediatamente, pero solo deseo ejecutar dos a la vez (uno para cada núcleo). Tan pronto como haya terminado, quiero que pase al siguiente en la lista hasta que finalice, luego continúe con el programa.
¿Cómo puedo hacer esto?
(He mirado en las funciones de grupo de subprocesos y la cola, pero no puedo encontrar una respuesta simple.)
Editar: quizás debería añadir que cada uno de mis hilos está utilizando para ejecutar un subprocess.Popen
línea de comando separada decodificador (flac) canalizado a stdout que se alimenta a una línea de comandos codificador (lame/mp3).
¿Por qué molestarse? ¿Qué hay de malo en dejar que tus hilos compitan entre sí? Es más rápido tener cada núcleo completamente saturado de trabajo. –
Bueno, supongo que no lo había pensado así ... con una biblioteca de música de más de 2.000 archivos, pensé que el desove (a la vez) 2.000 proceso de decodificación (flac) canalizaba a 2.000 procesos de codificación (cojo) al mismo tiempo sería subóptimo. ¿Me equivoco? – thornomad
@thornomad: Sí, estás equivocado. Limitarse a exactamente 2 procesos porque tiene 2 núcleos es incorrecto. Un proceso no saturará un núcleo con trabajo. Incluso una tubería de proceso de tres partes puede tener suficiente E/S que el núcleo no está totalmente ocupado. –