Sobes.tech
Middle

Como escolher entre multithreading, multiprocessing e asyncio para descarregar uma grande quantidade de ficheiros em Python?

sobes.tech IA

Resposta da IA

Ao fazer o download de um grande número de ficheiros em Python, a escolha entre multithreading, multiprocessing e asyncio depende da natureza da tarefa e das limitações:

  • Multithreading: É bom para tarefas ligadas a I/O, como pedidos de rede, pois o Python permite executar operações de entrada/saída em paralelo, apesar do GIL. Os threads são leves, mas um grande número de threads pode gerar custos adicionais.

  • Multiprocessing: Usa múltiplos processos, evitando o GIL, e é adequado para tarefas ligadas à CPU. Para descarregar ficheiros, geralmente é excessivo, pois o tempo principal é dedicado a aguardar a rede.

  • Asyncio: A programação assíncrona permite gerir eficazmente um grande número de operações de rede simultâneas sem criar múltiplos threads ou processos. Requer que as bibliotecas utilizadas suportem async/await.

Para descarregar um grande número de ficheiros, o ideal é usar asyncio com clientes HTTP assíncronos (por exemplo, aiohttp), pois minimiza os custos adicionais e utiliza os recursos de forma eficiente.

Exemplo com aiohttp:

import asyncio
import aiohttp

async def download_file(session, url):
    async with session.get(url) as resp:
        content = await resp.read()
        filename = url.split('/')[-1]
        with open(filename, 'wb') as f:
            f.write(content)

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [download_file(session, url) for url in urls]
        await asyncio.gather(*tasks)

urls = ["https://example.com/file1", "https://example.com/file2"]
asyncio.run(main(urls))

Se a biblioteca ou o ambiente não suportarem asyncio, pode usar multithreading com ThreadPoolExecutor para carregamentos paralelos.