برنامه نویسی چند نخی (Multi-Thread) در Python

چند نخی (Multithreading)
چند نخی (Multithreading)



بی مقدمه بریم سراغ اصل مطلب، همه امون تجربه اجرا کردن چندین برنامه به صورت همزمان را داشتیم پس اگر همین کار را با یکی از زبان برنامه نویسی انجام بدیم به اصطلاح از تکنیک مولتی ترد استفاده کردیم، یعنی هر نخ وظیفه ای مشخصی داره به جای اینکه از یک نخ استفاده کنیم تا به خواسته خودمون برسیم (ممکنه خیلی زمان بر باشه) بیایم از چند نخ استفاده کنیم تا سریع تر به پایان قصه برسیم، پس برنامه نویسی چند نخی میتونه سرعت عملیات را ما زیاد میکنن (البته نه همیشه) اگر دوست دارید بیشتر بخوندید راجبش پس اینجا را کلیک کنید.



اجازه بدید کمی عملیاتی تر قصه رو بررسی کنیم:

اول از همه دنیا را به صورت سینگل ترد ببینیم، پس به زبان پایتون کد ساده ای مینویسم که با کتابخانه ریکوست یک فایل به شکل json دانلود کنه و ذخیره کنه مثل همچین صفحه ای (مشخصات فیلم Tenet) که یک API KEY لازم داره که من از این لینک ساختم با یک سایتی که به من اجازه میده یک ایمیل موقت برای خودم بسازم.

خوب من این API KEY که ساختم تا ۱۰۰۰ تا ریکوست رایگانه اگر یک وقت لینک بالا از کار افتاد به همین علت بوده که شما خودتون به سادگی میتونید API KEY خودتونو بسازید.

# api_key = 4719d347
import requests
import uuid

url_list = ['http://www.omdbapi.com/?i=tt6723592&apikey=4719d347', 'http://www.omdbapi.com/?i=tt2382320&apikey=4719d347']

for url in url_list:
    html = requests.get(url, stream=True)
    file_name = uuid.uuid1()
    open(f'{file_name}.json', 'wb').write(html.content)

فرض کنید تعداد فیلم های که میخواهید اطلاعات اشونو داشته باشید از ۱ میلیون بیشتره اونوقت چی کار میکنید؟ حالا نوبت استفاده از قدرت مولتی ترد پایتونه که من با قطعه کدی که در ادامه براتون نوشتم در مدت زمان ۲۲ دقیقه ۴۹،۹۸۰ فایل به صورت json ذخیره کردم که حجم داده ها ۱ گیگابایت بود.

import requests
import uuid
from concurrent.futures import ThreadPoolExecutor, as_completed

url_list = ['url1', 'url2'] 

def download_file(url, file_name):
    try:
        html = requests.get(url, stream=True)
        open(f'{file_name}.json', 'wb').write(html.content)
        return html.status_code
    except requests.exceptions.RequestException as e:
       return e

def runner():
    threads= []
    with ThreadPoolExecutor(max_workers=20) as executor:
        for url in url_list:
            file_name = uuid.uuid1()
            threads.append(executor.submit(download_file, url, file_name))
           
        for task in as_completed(threads):
            print(task.result()) 
      
runner()