logo

Administrador de descargas multiproceso simple en Python

A Administrador de descargas es básicamente un programa informático dedicado a la tarea de descargar archivos independientes de Internet. Aquí vamos a crear un Administrador de descargas simple con la ayuda de subprocesos en Python. Usando subprocesos múltiples, un archivo se puede descargar en forma de fragmentos simultáneamente desde diferentes subprocesos. Para implementar esto, crearemos una herramienta de línea de comandos simple que acepte la URL del archivo y luego lo descargue.

Requisitos previos: máquina Windows con Python instalado.



java leer csv

Configuración

Descargue los paquetes mencionados a continuación desde el símbolo del sistema.

1. Paquete Click: Click es un paquete de Python para crear hermosas interfaces de línea de comandos con tan poco código como sea necesario. Es el kit de creación de interfaz de línea de comandos.

instalación de pip, haga clic



2. Paquete de solicitudes: en esta herramienta descargaremos un archivo basado en la URL (direcciones HTTP). Requests es una biblioteca HTTP escrita en Python que le permite enviar solicitudes HTTP. Puede agregar encabezados de archivos de datos de varias partes y parámetros con diccionarios simples de Python y acceder a los datos de respuesta de la misma manera.

solicitudes de instalación de pip

3. Paquete de subprocesos: para trabajar con subprocesos necesitamos un paquete de subprocesos.



roscado de instalación de pipa

Implementación

Nota:

El programa se ha dividido en partes para que sea fácil de entender. Asegúrese de no perderse ninguna parte del código mientras ejecuta el programa.

Paso 1: importar los paquetes necesarios

Estos paquetes proporcionan las herramientas necesarias para que las solicitudes web manejen entradas de línea de comandos y creen subprocesos.

Python
import click import requests import threading 

Paso 2: crear la función de controlador

Cada hilo ejecutará esta función para descargar su parte específica del archivo. Esta función es responsable de solicitar solo un rango específico de bytes y escribirlos en la posición correcta del archivo.

Python
def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) 

Paso 3: Defina la función principal con un clic

Convierte la función en una utilidad de línea de comandos. Esto define cómo los usuarios interactúan con el script desde la línea de comando.

Python
#Note: This code will not work on online IDE @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): 

Paso 4: establezca el nombre del archivo y determine el tamaño del archivo

Necesitamos el tamaño del archivo para dividir la descarga entre subprocesos y garantizar que el servidor admita descargas a distancia.

Python
 r = requests.head(url_of_file) file_name = name if name else url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return 

Paso 5: preasignar espacio para archivos

La preasignación garantiza que el archivo tenga el tamaño correcto antes de escribir fragmentos en rangos de bytes específicos.

Python
 part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) 

Paso 6: crear hilos

A los subprocesos se les asignan rangos de bytes específicos para descargar en paralelo.

Python
 threads = [] for i in range(number_of_threads): start = part * i end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() 

Paso 7: Únase a los hilos

Garantiza que todos los subprocesos se completen antes de que finalice el programa.

Python
 for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 

Código:

Python
import click import requests import threading def Handler(start end url filename): headers = {'Range': f'bytes={start}-{end}'} r = requests.get(url headers=headers stream=True) with open(filename 'r+b') as fp: fp.seek(start) fp.write(r.content) @click.command(help='Downloads the specified file with given name using multi-threading') @click.option('--number_of_threads' default=4 help='Number of threads to use') @click.option('--name' type=click.Path() help='Name to save the file as (with extension)') @click.argument('url_of_file' type=str) def download_file(url_of_file name number_of_threads): r = requests.head(url_of_file) if name: file_name = name else: file_name = url_of_file.split('/')[-1] try: file_size = int(r.headers['Content-Length']) except: print('Invalid URL or missing Content-Length header.') return part = file_size // number_of_threads with open(file_name 'wb') as fp: fp.write(b'' * file_size) threads = [] for i in range(number_of_threads): start = part * i # Make sure the last part downloads till the end of file end = file_size - 1 if i == number_of_threads - 1 else (start + part - 1) t = threading.Thread(target=Handler kwargs={ 'start': start 'end': end 'url': url_of_file 'filename': file_name }) threads.append(t) t.start() for t in threads: t.join() print(f'{file_name} downloaded successfully!') if __name__ == '__main__': download_file() 


Hemos terminado con la parte de codificación y ahora seguimos los comandos que se muestran a continuación para ejecutar el archivo .py.

python filename.py –-help

Producción:

ordenación por inserción java
salida_ayuda' title=python nombre de archivo.py –-ayuda


Este comando muestra el uso de la herramienta de comando de clic y las opciones que la herramienta puede aceptar. A continuación se muestra el comando de muestra en el que intentamos descargar un archivo de imagen jpg desde una URL y también le damos un nombre y un número de subprocesos.

Captura de pantalla-2025-04-07-155058' loading='lazy' title=comando de muestra para descargar un jpg

Después de ejecutar todo correctamente, podrá ver su archivo (flower.webp en este caso) en el directorio de su carpeta como se muestra a continuación:

Captura de pantalla-2025-04-07-155750' loading='lazy' title=directorio

Finalmente hemos terminado con éxito y esta es una de las formas de crear un administrador de descargas multiproceso simple en Python.