Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Programa para converter mp3 utilizando o módulo multiprocessing está em looping

import subprocess,os
from multiprocessing import Process


#colocar os MP3 em uma pasta exclusiva mp3, senao ele add qq arquivo
MP3 = os.listdir("/home/govinda/Desktop/musicas/mp3") #lista de MP3


os.chdir("/home/govinda/Desktop/musicas/mp3") #diretorio onde estao as MP3

def ConverteMusica(origem,destino):

    input_file_fmt = origem
    output_file_fmt = destino


    subprocess.call(['ffmpeg',
                     '-i',
                     input_file_fmt,
                     '-acodec',
                     'libmp3lame',
                     '-ac',
                     '2',
                     '-ab',
                     '16k',
                     '-ar',
                     '44100',
                     output_file_fmt])

if __name__ == '__main__': #deve usar isso com o multiprocessing!

    for title in MP3:


        MeuConversor = Process(target=ConverteMusica,args=(title,title.split(".")[0] + "_" + ".mp3",))
        MeuConversor.start()
        MeuConversor.join()

Se eu tentar rodar o programa acima no IDLE, fica em looping.

Ao rodar pela linha de comando do Ubuntu, usando python3 subprocessosComMultiprocessing.py, recebo:

TypeError: ConverteMusica() takes 1 positional argument but 7 were given

Agora, fiquei perdido!

4 respostas

Opa, não manjo de python, mas a mensagem indica que alguém está chamando a função ConverteMusica com 7 argumentos em vez de 1 só. Acho que essa é a primeira coisa que você deveria ver.

Oi, Edson! Beleza? Nessa linha:

MeuConversor1 = Process(target=ConverteMusica,args=("ved.mp3"))

quando você passa para args ("ved.mp3"), você está passando uma string, em vez de uma tupla, que é o esperado. Passando a string, o Python está considerando que cada caractere da string é um argumento diferente. Para uma tupla só com um elemento, temos que colocar uma vírgula, dessa forma:

args=("ved.mp3",)

Faça essa mudança e diga como ficou agora! Abraços!

@Yan Orestes: O erro de argumentos sumiu. Obrigado.

Outra questão relacionada. LI sobre Threads e o GIL e, pelo que eu entendi, o melhor é usar o multiprocessing a usar Threads. E quanto ao módulo Concurrent.Futures? É indicado? Como eu poderia trocar no meu programa o multiprocessing pelo Concurrent.Futures?

solução!

Edson, eu não entendo muito de paralelismo e concorrência no Python, então não tenho certeza se e como você poderia substituir o multiprocessing pelo concorrent.futures. O que eu sei é que acaba não fazendo muita diferença, então você pode ficar com o multiprocessing se soluciona seu problema. Dá uma olhada nesses links (são em inglês :(, mas podem ajudar!): Artigo sobre concorrent.futures | Discussão no StackOveflow.

Espero que esses links possam te ajudar! Abraços!