Како побољшати свој Питхон код уз истовременост и паралелизам

Кључне Такеаваис

  • Конкурентност и паралелизам су основни принципи извршавања задатака у рачунарству, при чему сваки има своје посебне карактеристике.
  • Конкуренција омогућава ефикасно коришћење ресурса и побољшани одзив апликација, док је паралелизам кључан за оптималне перформансе и скалабилност.
  • Питхон пружа опције за руковање паралелношћу, као што су нити и асинхроно програмирање са асинцио, као и паралелизам коришћењем вишепроцесног модула.

Конкурентност и паралелизам су две технике које вам омогућавају да истовремено покренете неколико програма. Питхон има више опција за истовремено и паралелно руковање задацима, што може бити збуњујуће.

Истражите алате и библиотеке доступне за исправну имплементацију конкурентности и паралелизма у Питхон-у и по чему се они разликују.

Разумевање конкурентности и паралелизма

Конкурентност и паралелизам се односе на два основна принципа извршавања задатака у рачунарству. Сваки има своје посебне карактеристике.

  • Конкурентност је способност програма да управља више задатака у исто време, а да их нужно не извршава у исто време. Окреће се око идеје преплитања задатака, пребацивања између њих на начин који изгледа истовремено.
  • Паралелизам, с друге стране, укључује извршавање више задатака истински паралелно. Обично користи предности више ЦПУ језгара или процесора. Паралелизам постиже истинско истовремено извршавање, омогућавајући вам да брже обављате задатке и добро је погодан за рачунарски интензивне операције.
  •   Топ 11 Инстаграм аналитичкиһ алата за успеһ на друштвеним мрежама

    Важност конкурентности и паралелизма

    Потреба за конкурентношћу и паралелизмом у рачунарству не може се преценити. Ево зашто су ове технике важне:

  • Коришћење ресурса: Конкуренција омогућава ефикасно коришћење системских ресурса, обезбеђујући да задаци активно напредују, а не да беспослено чекају спољне ресурсе.
  • Реаговање: Конкурентност може побољшати одзив апликација, посебно у сценаријима који укључују корисничке интерфејсе или веб сервере.
  • Перформансе: Паралелизам је кључан за постизање оптималних перформанси, посебно у задацима везаним за ЦПУ као што су сложена израчунавања, обрада података и симулације.
  • Скалабилност: И конкурентност и паралелизам су од суштинског значаја за изградњу скалабилних система.
  • Отпорност на будућност: Како хардверски трендови настављају да фаворизују процесоре са више језгара, способност да се искористи паралелизам ће постати све потребнија.
  • Конкуренција у Питхон-у

    Можете постићи паралелност у Питхон-у коришћењем нити и асинхроног програмирања са асинцио библиотеком.

    Тхреадинг у Питхон-у

    Тхреадинг је Питхон механизам конкурентности који вам омогућава да креирате и управљате задацима у оквиру једног процеса. Нити су погодне за одређене врсте задатака, посебно оне који су И/О везани и могу имати користи од истовременог извршавања.

    Питхон-ов модул за обраду нити пружа интерфејс високог нивоа за креирање и управљање нитима. Док ГИЛ (Глобал Интерпретер Лоцк) ограничава нити у смислу правог паралелизма, оне и даље могу постићи конкурентност ефикасним преплитањем задатака.

    Код у наставку приказује пример имплементације конкурентности помоћу нити. Користи Питхон библиотеку захтева за слање ХТТП захтева, уобичајеног задатка блокирања И/О. Такође користи модул времена за израчунавање времена извршења.

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

    Покретањем овог програма требало би да видите колико су захтеви са нитима бржи од узастопних захтева. Иако је разлика само делић секунде, добијате јасан осећај побољшања перформанси када користите нити за задатке везане за У/И.

      Како унапред попунити одговоре у Гоогле обрасцима

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

    асинцио обезбеђује петљу догађаја која управља асинхроним задацима званим корутине. Корутине су функције које можете паузирати и наставити, што их чини идеалним за задатке везане за У/И. Библиотека је посебно корисна за сценарије у којима задаци укључују чекање на спољне ресурсе, као што су мрежни захтеви.

    Можете да измените претходни пример слања захтева да ради са асинцио:

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

    Користећи код, можете истовремено преузимати веб странице користећи асинцио и искористити предности асинхроних И/О операција. Ово може бити ефикасније од нити за У/И везане задатке.

    Паралелизам у Пајтону

    Паралелизам можете имплементирати користећи Питхон-ов вишепроцесни модулшто вам омогућава да у потпуности искористите предности вишејезгарних процесора.

    Вишепроцесирање у Питхон-у

    Пајтонов модул за више процеса пружа начин да се постигне паралелизам креирањем одвојених процеса, сваки са сопственим Питхон интерпретатором и меморијским простором. Ово ефективно заобилази Глобално закључавање тумача (ГИЛ), што га чини погодним за задатке везане за ЦПУ.

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

    У овом примеру, мултипроцесирање покреће више процеса, омогућавајући функцији довнлоад_урл да ради паралелно.

      Како приказати слику на Зоом састанку

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

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

    Можете да користите истовременост када се бавите задацима везаним за У/И, као што су читање и писање у датотеке или постављање мрежних захтева, и када су ограничења меморије забринута.

    Користите вишепроцесирање када имате задатке везане за ЦПУ који могу имати користи од правог паралелизма и када имате чврсту изолацију између задатака, где неуспех једног задатка не би требало да утиче на друге.

    Искористите предност истовремености и паралелизма

    Паралелизам и конкурентност су ефикасни начини за побољшање одзива и перформанси вашег Питхон кода. Важно је разумети разлике између ових концепата и одабрати најефикаснију стратегију.

    Питхон нуди алате и модуле који су вам потребни да учините ваш код ефикаснијим кроз конкурентност или паралелизам, без обзира да ли радите са процесима везаним за ЦПУ или са процесима везаним за У/И.