Roda mas nada acontece, onde estou errando?

estou fazendo um programa para zipar arquivos de backup, porém quando tento disparar a zipagem usando threads para ficar assíncrono, ele roda, não dá nenhum erro, porém não acontece nada.

    def zipar(self,com_lzma=True):
        lzma,rar = self.para_zipar_hoje()
        if com_lzma:
            for nome in lzma:
                t = threading.Thread(target=self.zipar_lzma,args=(nome,))
                t.start
            for nome in rar:
                t = threading.Thread(target=self.winrar_rar,args=(nome,))
                t.start
        else:   
            for nome in rar.extend(lzma):
                t = threading.Thread(target=self.winrar_rar,args=(nome,))
                t.start

quando faço sem thread ou asyncio ele roda normal… como faço para disparar tudo ao mesmo tempo de forma assíncrona?
ps: está em português para entenderem a lógica de onde quero chegar.

Já tentou aplicar um t.join() depois de dar o start na thread?

Algo assim:

t = Thread(target=self.zipar_lzma, args=(nome))
t.start()
t.join()

Referência: threading — Thread-based parallelism — Python 3.11.1 documentation

1 curtida

Saudações meu querido, utilize um TRY CATCH para realizar essa operação, vai te entregar o erro caso exista!

1 curtida

python não tem try catch, tem try except,
usei e não me deu o erro mesmo assim.

com join funcionou, mas não ficou assíncrono, ainda está esperando um por um terminar.
os arquivos tem entre 0,5 e 25 giga ent não tem como esperar um a um.

Nesse caso você devera fazer um arquivo CRON, para deixar o servidor operar sozinho. E não o usuário do aplicativo.

1 curtida

fiz um batch, porém ele está zipando tudo em mesmo formato (rar do winrar), e tem arquivos que dependendo do conteúdo é melhor zipar em lzma2, por isso estou fazendo o programa, a zipagem não pode ocorrer em servidor, as maquinas locais que fazem esse processo.

Tenta disparar e inicializar todas as threads que você precisa e aplica o join somente após ter inicializado todas elas!

Já tentou fazer dessa forma?

O problema que eu acredito que está acontecendo é que como as threads fazem o processamento async, o processo principal que é o de start do script python termina antes das threads terminarem seus trabalhos, pois não tem ninguém ouvindo elas e fazendo o processo principal aguardar os secundários terminarem, matando tudo.

1 curtida

o problema é como criar isso? talvez uma lista com uma future de cada thread? mas como? pq é “impossível” nomear dinamicamente a variável.

Por que não tenta usar um ThreadPool ou um ThreadPoolExecutor?

Ambos gerenciam as threads pra vc (veja os exemplos nos links indicados), bem mais simples que tentar gerenciar manualmente.

2 curtidas

tentei mas não entendi esses modulos.
enlouqueci e criei uma lista parâmetro do objeto, ziper.__threadlist = []
e no lugar de digitar t.join coloquei self.__threadlist.append(t) e funcionou… como? realmente não entendi. ps: essa lista some ao final da execução, nem mesmo o retorno 0 ou 1 como num procedimento acontece.

Poxa, é só fazer uma busca simples por exemplos de uso :slight_smile:

Aqui tem um exemplo, e aqui tem um guia mais completo.

Acho que vale a pena pesquisar mais, pois é melhor que gerenciar as threads na mão (ou pior, fazer algo e não entender porque funcionou).

2 curtidas

meu deus que parada complexa, fiquei lendo sobre o assunto e cheguei a conclusão de que não estava funcionando porquê o tempo de execução dele estava indefinido, o que ficava definido no .join() porém o vscode entendia como “o thread da vez” e não como “dispara e manda fazer”, já em uma lista, ele “aloca o thread” como um objeto existente deixando seu tempo ad eterno, o que não acontece porquê assim que o código termina, o python limpa e o thread se desfaz.
ps: foi o que entendi lendo sobre threads e objetos, não quer dizer que seja a verdade.

1 curtida