Как да подобрите своя код на Python с едновременност и паралелизъм

Ключови изводи

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

Паралелността и паралелността са две техники, които ви позволяват да изпълнявате няколко програми едновременно. Python има множество опции за обработка на задачи едновременно и паралелно, което може да бъде объркващо.

Разгледайте наличните инструменти и библиотеки за правилно прилагане на едновременност и паралелизъм в Python и как се различават.

Разбиране на едновременността и паралелизма

Паралелността и паралелността се отнасят до два фундаментални принципа за изпълнение на задачи в изчисленията. Всеки има своите отличителни характеристики.

  • Паралелността е способността на една програма да управлява множество задачи едновременно, без непременно да ги изпълнява по едно и също време. Тя се върти около идеята за преплитане на задачи, превключване между тях по начин, който изглежда едновременно.
  • Паралелизмът, от друга страна, включва изпълнение на множество задачи наистина паралелно. Обикновено се възползва от множество CPU ядра или процесори. Паралелизмът постига истинско едновременно изпълнение, което ви позволява да изпълнявате задачи по-бързо и е много подходящ за операции с интензивно изчисление.
  •   MZ спира ли Game of War?

    Значението на едновременността и паралелизма

    Необходимостта от едновременност и паралелизъм в изчисленията не може да бъде надценена. Ето защо тези техники имат значение:

  • Използване на ресурсите: Паралелността позволява ефективно използване на системните ресурси, като гарантира, че задачите активно напредват, вместо да чакат лениво външни ресурси.
  • Отзивчивост: Паралелността може да подобри отзивчивостта на приложенията, особено в сценарии, включващи потребителски интерфейси или уеб сървъри.
  • Производителност: Паралелизмът е от решаващо значение за постигане на оптимална производителност, особено при задачи, свързани с процесора, като сложни изчисления, обработка на данни и симулации.
  • Мащабируемост: както едновременността, така и паралелизмът са от съществено значение за изграждането на мащабируеми системи.
  • Подготвени за бъдещето: Тъй като хардуерните тенденции продължават да предпочитат многоядрените процесори, способността за използване на паралелизъм ще става все по-необходима.
  • Паралелност в Python

    Можете да постигнете едновременност в Python, като използвате нишки и асинхронно програмиране с библиотеката asyncio.

    Нишки в Python

    Threading е механизъм за едновременност на Python, който ви позволява да създавате и управлявате задачи в рамките на един процес. Нишките са подходящи за определени типове задачи, особено тези, които са I/O-свързани и могат да се възползват от едновременното изпълнение.

    Модул за нишки на Python предоставя интерфейс на високо ниво за създаване и управление на нишки. Въпреки че GIL (Global Interpreter Lock) ограничава нишките от гледна точка на истинския паралелизъм, те все пак могат да постигнат едновременност чрез ефективно преплитане на задачи.

    Кодът по-долу показва примерна реализация на едновременност с помощта на нишки. Той използва библиотеката за заявки на Python, за да изпрати HTTP заявка, често срещана I/O блокираща задача. Той също така използва модула за време за изчисляване на времето за изпълнение.

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

    Изпълнявайки тази програма, трябва да видите колко по-бързи са нишковидните заявки от последователните заявки. Въпреки че разликата е само част от секундата, получавате ясно усещане за подобрението на производителността, когато използвате нишки за I/O-обвързани задачи.

      Как да се абонирам за календари на Mac

    Асинхронно програмиране с Asyncio

    асинхронен предоставя цикъл на събития, който управлява асинхронни задачи, наречени съпрограми. Съпрограмите са функции, които можете да поставите на пауза и възобновите, което ги прави идеални за I/O-обвързани задачи. Библиотеката е особено полезна за сценарии, при които задачите включват изчакване на външни ресурси, като мрежови заявки.

    Можете да промените предишния пример за изпращане на заявка, за да работи с 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 и да се възползвате от асинхронните I/O операции. Това може да бъде по-ефективно от нишките за I/O-обвързани задачи.

      Как да създадете ограничения за външен ключ в SQL

    Паралелизъм в Python

    Можете да реализирате паралелизъм, като използвате Мултипроцесорният модул на Pythonкоето ви позволява да се възползвате напълно от многоядрените процесори.

    Многопроцесорна обработка в Python

    Мултипроцесорният модул на Python предоставя начин за постигане на паралелизъм чрез създаване на отделни процеси, всеки със собствен интерпретатор на Python и пространство в паметта. Това ефективно заобикаля Global Interpreter Lock (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 да работи паралелно.

    Кога да използвате едновременност или паралелизъм

    Изборът между едновременност и паралелизъм зависи от естеството на вашите задачи и наличните хардуерни ресурси.

    Можете да използвате паралелност, когато се занимавате с I/O-обвързани задачи, като четене и писане на файлове или правене на мрежови заявки, и когато ограниченията на паметта са проблем.

    Използвайте мултипроцесиране, когато имате задачи, обвързани с процесора, които могат да се възползват от истинския паралелизъм и когато имате стабилна изолация между задачите, където отказът на една задача не трябва да оказва влияние върху други.

    Възползвайте се от едновременността и паралелизма

    Паралелизмът и паралелността са ефективни начини за подобряване на отзивчивостта и производителността на вашия Python код. Важно е да разберете разликите между тези концепции и да изберете най-ефективната стратегия.

    Python предлага инструментите и модулите, от които се нуждаете, за да направите кода си по-ефективен чрез едновременност или паралелизъм, независимо дали работите с обвързани с процесора или I/O процеси.