logo

مدير تنزيل بسيط متعدد الخيوط في بايثون

أ مدير التحميل هو في الأساس برنامج كمبيوتر مخصص لمهمة تنزيل الملفات المستقلة من الإنترنت. سنقوم هنا بإنشاء مدير تنزيل بسيط بمساعدة سلاسل المحادثات في Python. باستخدام سلاسل العمليات المتعددة، يمكن تنزيل الملف على شكل أجزاء في وقت واحد من سلاسل رسائل مختلفة. لتنفيذ ذلك، سنقوم بإنشاء أداة سطر أوامر بسيطة تقبل عنوان URL للملف ثم تقوم بتنزيله.

المتطلبات الأساسية: جهاز يعمل بنظام Windows مع تثبيت Python.



يثبت

قم بتنزيل الحزم المذكورة أدناه من موجه الأوامر.

1. Click package: Click عبارة عن حزمة Python لإنشاء واجهات سطر أوامر جميلة مع أقل قدر ممكن من التعليمات البرمجية حسب الضرورة. إنها مجموعة أدوات إنشاء واجهة سطر الأوامر.

انقر فوق تثبيت النقطة



2. حزمة الطلبات: في هذه الأداة سنقوم بتنزيل ملف بناءً على عنوان URL (عناوين HTTP). الطلبات عبارة عن مكتبة HTTP مكتوبة بلغة Python والتي تسمح لك بإرسال طلبات HTTP. يمكنك إضافة رؤوس وملفات بيانات متعددة الأجزاء ومعلمات باستخدام قواميس Python البسيطة والوصول إلى بيانات الاستجابة بنفس الطريقة.

طلبات تثبيت النقطة

3. حزمة الخيوط: للعمل مع الخيوط نحتاج إلى حزمة الخيوط.



خيوط تثبيت النقطة

تطبيق

ملحوظة:

تم تقسيم البرنامج إلى أجزاء لتسهيل فهمه. تأكد من عدم فقدان أي جزء من الكود أثناء تشغيل البرنامج.

دمج النوع

الخطوة 1: استيراد الحزم المطلوبة

توفر هذه الحزم الأدوات اللازمة لجعل طلبات الويب تتعامل مع مدخلات سطر الأوامر وإنشاء سلاسل الرسائل.

Python
import click import requests import threading 

الخطوة 2: إنشاء وظيفة المعالج

سيقوم كل مؤشر ترابط بتنفيذ هذه الوظيفة لتنزيل الجزء المحدد من الملف. هذه الوظيفة مسؤولة عن طلب نطاق معين فقط من البايتات وكتابتها في الموضع الصحيح في الملف.

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) 

الخطوة 3: تحديد الوظيفة الرئيسية بالنقر

يحول الوظيفة إلى أداة مساعدة لسطر الأوامر. يحدد هذا كيفية تفاعل المستخدمين مع البرنامج النصي من سطر الأوامر.

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): 

الخطوة 4: تعيين اسم الملف وتحديد حجم الملف

نحتاج إلى حجم الملف لتقسيم التنزيل بين سلاسل الرسائل والتأكد من أن الخادم يدعم التنزيلات المتنوعة.

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 

الخطوة 5: التخصيص المسبق لمساحة الملف

يضمن التخصيص المسبق أن يكون الملف بالحجم الصحيح قبل أن نكتب أجزاء إلى نطاقات بايت محددة.

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

الخطوة 6: إنشاء المواضيع

يتم تعيين نطاقات بايت محددة للخيوط للتنزيل بالتوازي.

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() 

الخطوة 7: الانضمام إلى المواضيع

يضمن اكتمال جميع المواضيع قبل انتهاء البرنامج.

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

شفرة:

نيك فقط
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() 


لقد انتهينا من جزء الترميز ونتبع الآن الأوامر الموضحة أدناه لتشغيل ملف .py.

python filename.py –-help

الإخراج:

help_output' title=بيثون filename.py – مساعدة


يوضح هذا الأمر استخدام أداة أمر النقر والخيارات التي يمكن أن تقبلها الأداة. يوجد أدناه نموذج للأمر حيث نحاول تنزيل ملف صورة jpg من عنوان URL ونقدم أيضًا اسمًا ورقم_of_threads.

لقطة الشاشة-2025-04-07-155058' loading='lazy' title=أمر عينة لتحميل JPG

بعد تشغيل كل شيء بنجاح، ستتمكن من رؤية ملفك (flower.webp في هذه الحالة) في دليل المجلد الخاص بك كما هو موضح أدناه:

لقطة الشاشة-2025-04-07-155750' loading='lazy' title=دليل

أخيرًا لقد انتهينا من ذلك بنجاح وهذه إحدى الطرق لإنشاء مدير تنزيل بسيط متعدد الخيوط في Python.