Як покращити свій код Python за допомогою паралельності та паралелізму

Ключові висновки

  • Одночасність і паралелізм є фундаментальними принципами виконання завдань в обчислювальній техніці, кожен з яких має свої відмінні характеристики.
  • Паралелізм забезпечує ефективне використання ресурсів і покращує швидкість реагування програм, тоді як паралелізм має вирішальне значення для оптимальної продуктивності та масштабованості.
  • Python надає параметри для керування паралелізмом, такі як потокове та асинхронне програмування з asyncio, а також паралелізм за допомогою багатопроцесорного модуля.

Паралелізм і паралелізм — це дві техніки, які дозволяють запускати декілька програм одночасно. Python має кілька варіантів одночасної та паралельної обробки завдань, що може заплутати.

Ознайомтеся з інструментами та бібліотеками, доступними для правильної реалізації паралелізму та паралелізму в Python, і чим вони відрізняються.

Розуміння паралельності та паралелізму

Одночасність і паралелізм відносяться до двох фундаментальних принципів виконання завдань в обчислювальній техніці. Кожен має свої відмінні характеристики.

  • Паралельність — це здатність програми керувати декількома завданнями одночасно, не обов’язково виконуючи їх одночасно. Він обертається навколо ідеї чергування завдань, перемикання між ними таким чином, що здається одночасним.
  • Паралелізм, з іншого боку, передбачає справжнє паралельне виконання кількох завдань. Зазвичай він використовує переваги кількох ядер ЦП або процесорів. Паралелізм забезпечує справжнє одночасне виконання, дозволяючи виконувати завдання швидше, і добре підходить для інтенсивних обчислювальних операцій.
  • Важливість паралельності та паралелізму

    Неможливо переоцінити потребу в паралельності та паралелізмі в обчисленнях. Ось чому ці методи важливі:

  • Використання ресурсів: паралелізм дозволяє ефективно використовувати системні ресурси, забезпечуючи активне виконання завдань, а не бездіяльне очікування зовнішніх ресурсів.
  • Швидкість реагування: паралелізм може покращити швидкість реагування програм, особливо в сценаріях із використанням інтерфейсів користувача або веб-серверів.
  • Продуктивність. Паралелізм має вирішальне значення для досягнення оптимальної продуктивності, особливо в завданнях, пов’язаних з процесором, наприклад складних обчисленнях, обробці даних і моделюванні.
  • Масштабованість: як паралелізм, так і паралелізм є важливими для створення масштабованих систем.
  • Розрахунок на майбутнє: Оскільки апаратні тенденції продовжують надавати перевагу багатоядерним процесорам, здатність використовувати паралелізм ставатиме все більш необхідною.
  • Паралелізм у Python

    Ви можете досягти паралелізму в Python за допомогою потоків і асинхронного програмування з бібліотекою asyncio.

    Потоки в Python

    Потоковість — це механізм паралельного виконання Python, який дозволяє створювати завдання та керувати ними в одному процесі. Потоки підходять для певних типів завдань, особливо для тих, які пов’язані з вводом-виводом і можуть виграти від одночасного виконання.

    Модуль потоків Python надає високорівневий інтерфейс для створення потоків і керування ними. Хоча GIL (Global Interpreter Lock) обмежує потоки з точки зору справжнього паралелізму, вони все одно можуть досягти паралелізму шляхом ефективного чергування завдань.

    Наведений нижче код показує приклад реалізації паралелізму за допомогою потоків. Він використовує бібліотеку запитів Python для надсилання HTTP-запиту, звичайного завдання блокування вводу-виводу. Він також використовує модуль часу для обчислення часу виконання.

     import requests
    import time
    import threading

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    def download_url(url):
        response = requests.get(url)
        print(f"Downloaded {url} - Status Code: {response.status_code}")


    start_time = time.time()

    for url in urls:
        download_url(url)

    end_time = time.time()
    print(f"Sequential download took {end_time - start_time:.2f} seconds\n")


    start_time = time.time()
    threads = []

    for url in urls:
        thread = threading.Thread(target=download_url, args=(url,))
        thread.start()
        threads.append(thread)


    for thread in threads:
        thread.join()

    end_time = time.time()
    print(f"Threaded download took {end_time - start_time:.2f} seconds")

    Запустивши цю програму, ви побачите, наскільки швидші потокові запити, ніж послідовні. Незважаючи на те, що різниця становить лише частки секунди, ви отримуєте чітке уявлення про підвищення продуктивності, використовуючи потоки для завдань, пов’язаних із введенням-виведенням.

    Асинхронне програмування за допомогою Asyncio

    asyncio забезпечує цикл подій, який керує асинхронними завданнями, які називаються співпрограмами. Співпрограми — це функції, які можна призупинити та відновити, що робить їх ідеальними для завдань, пов’язаних із введенням-виведенням. Бібліотека особливо корисна для сценаріїв, коли завдання передбачають очікування зовнішніх ресурсів, наприклад мережевих запитів.

    Ви можете змінити попередній приклад надсилання запиту для роботи з asyncio:

     import asyncio
    import aiohttp
    import time

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    async def download_url(url):
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as response:
                content = await response.text()
                print(f"Downloaded {url} - Status Code: {response.status}")


    async def main():
        
        tasks = [download_url(url) for url in urls]

        
        await asyncio.gather(*tasks)

    start_time = time.time()


    asyncio.run(main())

    end_time = time.time()

    print(f"Asyncio download took {end_time - start_time:.2f} seconds")

    Використовуючи цей код, ви можете одночасно завантажувати веб-сторінки за допомогою asyncio та використовувати переваги асинхронних операцій введення-виведення. Це може бути більш ефективним, ніж потокове виконання завдань, пов’язаних із вводом-виводом.

    Паралелізм у Python

    Ви можете реалізувати паралелізм за допомогою Багатопроцесорний модуль Pythonщо дозволяє повною мірою використовувати переваги багатоядерних процесорів.

    Багатопроцесорність у Python

    Багатопроцесорний модуль Python забезпечує спосіб досягнення паралелізму шляхом створення окремих процесів, кожен з яких має власний інтерпретатор Python і простір пам’яті. Це ефективно обходить глобальне блокування інтерпретатора (GIL), що робить його придатним для завдань, пов’язаних із процесором.

     import requests
    import multiprocessing
    import time

    urls = [
        'https://www.google.com',
        'https://www.wikipedia.org',
        'https://www.makeuseof.com',
    ]


    def download_url(url):
        response = requests.get(url)
        print(f"Downloaded {url} - Status Code: {response.status_code}")

    def main():
        
        num_processes = len(urls)
        pool = multiprocessing.Pool(processes=num_processes)

        start_time = time.time()
        pool.map(download_url, urls)
        end_time = time.time()

        
        pool.close()
        pool.join()

        print(f"Multiprocessing download took {end_time-start_time:.2f} seconds")

    main()

    У цьому прикладі багатопроцесорна обробка породжує кілька процесів, що дозволяє функції download_url працювати паралельно.

    Коли використовувати паралельність чи паралелізм

    Вибір між паралелізмом і паралелізмом залежить від характеру ваших завдань і доступних апаратних ресурсів.

    Ви можете використовувати паралелізм під час виконання завдань, пов’язаних із вводом-виводом, таких як читання та запис у файли чи надсилання мережевих запитів, а також у випадках обмеження пам’яті.

    Використовуйте багатопроцесорність, якщо у вас є завдання, пов’язані з процесором, які можуть виграти від справжнього паралелізму, і якщо у вас є надійна ізоляція між завданнями, де збій одного завдання не повинен впливати на інші.

    Скористайтеся перевагами паралельності та паралелізму

    Паралелізм і паралелізм є ефективними способами покращити швидкість реагування та продуктивність вашого коду Python. Важливо розуміти різницю між цими поняттями та вибрати найбільш ефективну стратегію.

    Python пропонує інструменти та модулі, необхідні для підвищення ефективності вашого коду за рахунок паралелізму чи паралелізму, незалежно від того, чи працюєте ви з процесами, пов’язаними з ЦП, чи з процесами введення/виведення.