Sriegimas žymiai sumažina programos vykdymo laiką. Sužinokite, kaip įdiegti sriegį Python.

Vykdymo laikas yra vienas iš bendrų programos efektyvumo rodiklių. Kuo greitesnis vykdymo laikas, tuo geresnė programa. Sriegimas yra technika, leidžianti programai vienu metu atlikti kelias užduotis arba procesus.

Sužinosite, kaip naudotis įtaisytuoju Python sriegimas modulis ir kartu.ypatybės modulis. Abu šie moduliai siūlo paprastus būdus kurti ir valdyti gijas

Sriegimo svarba

Sriegimas sumažina laiką, per kurį programa atlieka užduotį. Jei užduotyje yra kelios nepriklausomos užduotys, galite naudoti sriegius, kad užduotis vykdytumėte vienu metu, sumažinant programos laukimo laiką, kol bus baigta viena užduotis, prieš pereinant prie kitos.

Pavyzdžiui, programa, kuri atsisiunčia kelis vaizdo failus iš interneto. Ši programa gali naudoti sriegimą failams atsisiųsti lygiagrečiai, o ne po vieną. Tai pašalina laiką, kurį programa turės laukti, kol bus baigtas vieno failo atsisiuntimo procesas, prieš pereinant prie kito.

instagram viewer

Pradinė programa prieš sriegiant

Šios programos funkcija reiškia užduotį. Užduotis yra vienai sekundei pristabdyti programos vykdymą. Programa iškviečia funkciją du kartus, taigi sukuria dvi užduotis. Tada jis apskaičiuoja laiką, per kurį visa programa pradėjo veikti, ir parodo jį ekrane.

importuoti laikas

pradžios_laikas = laikas.perf_skaitiklis()

defPauzė():
spausdinti („Miegau 1 sekundę...“)
time.sleep(1)
spausdinti („Baigti miegoti...“)

Pauzė()
Pauzė()
finišo_laikas = laikas.perf_skaitiklis()
spausdinti (f'Baigė {raundas (pabaigos_laikas – pradžios_laikas, 2)} antra (s)“)

Išvestis rodo, kad programai vykdyti prireikė 2,01 sekundės. Kiekviena užduotis užtruko vieną sekundę, o likusią kodo dalį įvykdyti prireikė 0,01 sekundės.

Norėdami vienu metu atlikti abi užduotis, galite naudoti gijų sujungimą. Abi užduotys užtruks vieną sekundę.

Sriegimo įgyvendinimas naudojant sriegimo modulį

Norėdami modifikuoti pradinį kodą, kad įdiegtumėte sriegimą, importuokite sriegimas modulis. Sukurkite dvi gijas, siūlas_1 ir siūlas_2 naudojant Siūlas klasė. Paskambinkite į pradėti metodą kiekvienoje gijoje, kad pradėtumėte jos vykdymą. Paskambinkite į prisijungti metodą kiekvienoje gijoje ir palaukti, kol bus baigtas jų vykdymas, kol bus paleista likusi programa.

importuoti laikas
importuoti sriegimas
pradžios_laikas = laikas.perf_skaitiklis()

defPauzė():
spausdinti („Miegau 1 sekundę...“)
time.sleep(1)
spausdinti („Baigti miegoti...“)

sriegis_1 = sriegiavimas. Siūlas (target=pause)
sriegis_2 = sriegiavimas. Siūlas (target=pause)

thread_1.start()
thread_2.start()

thread_1.join()
thread_2.join()

finišo_laikas = laikas.perf_skaitiklis()
spausdinti (f'Baigė {raundas (pabaigos_laikas – pradžios_laikas, 2)} antra (s)“)

Programa paleis abi gijas vienu metu. Tai sumažins laiką, kurio reikia abiem užduotims atlikti.

Išvestis rodo, kad laikas, reikalingas toms pačioms užduotims atlikti, yra maždaug sekundė. Tai yra pusė pradinės programos laiko.

Sriegimo įgyvendinimas naudojant concurrent.futures modulį

Python 3.2 buvo pristatytas kartu.ateities modulis. Šis modulis suteikia aukšto lygio sąsają asinchroninėms užduotims vykdyti naudojant gijas. Tai suteikia paprastesnį būdą lygiagrečiai atlikti užduotis.

Norėdami pakeisti pradinę programą, kad ji naudotų sriegimą, importuokite concurrent.features modulį. Naudoti ThreadPoolExecutor klasę iš concurrent.futures modulio, kad sukurtumėte gijų telkinį. Pateikite Pauzė funkcija į baseiną du kartus. The Pateikti metodas grąžina a ateities objektas, vaizduojantis funkcijos iškvietimo rezultatą.

Pakartokite per ateities sandoriai ir išspausdinkite rezultatus naudodami rezultatas metodas.

importuoti laikas
importuoti kartu.ateities

pradžios_laikas = laikas.perf_skaitiklis()

defPauzė():
spausdinti („Miegau 1 sekundę...“)
time.sleep(1)
grąžinti„Baigti miegoti...“

su kartu.ateities. ThreadPoolExecutor() kaip vykdytojas:
rezultatai = [vykdytojas.submit (pause) dėl _ in diapazonas(2)]
dėl f in concurrent.futures.as_completed (rezultatai):
spausdinti (f.result())

finišo_laikas = laikas.perf_skaitiklis()

spausdinti (f'Baigė {raundas (pabaigos_laikas – pradžios_laikas, 2)} antra (s)“)

Concurrent.features modulis pasirūpina gijų paleidimu ir sujungimu už jus. Tai daro jūsų kodą švaresnį.

Išvestis yra identiška sriegimo moduliui. Sriegimo modulis yra naudingas paprastais atvejais, kai reikia lygiagrečiai paleisti keletą gijų. Kita vertus, concurrent.futures modulis yra naudingas sudėtingesniems atvejams, kai vienu metu reikia vykdyti daug užduočių.

Threading naudojimas realiame scenarijuje

Naudojant gijas aukščiau nurodytai programai paleisti, laikas sutrumpėjo viena sekunde. Realiame pasaulyje siūlai sutaupo daugiau laiko. Sukurkite programą, kuri atsisiunčia vaizdus iš interneto. Pradėkite nuo sukurti naują virtualią aplinką. Paleiskite šią komandą terminale, kad įdiegtumėte prašymus biblioteka:

pip diegimo užklausos

Užklausų biblioteka leis siųsti HTTP užklausas. Importuokite užklausų biblioteką ir laiko biblioteką.

importuoti prašymus
importuoti laikas

Sukurkite vaizdų, kuriuos norite atsisiųsti, URL sąrašą. Tegul jų būna bent dešimt, kad sriegimo metu pastebėtumėte reikšmingą skirtumą.

img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

Pereikite per sąrašą URL, atsisiunčiant kiekvieną vaizdą į tą patį aplanką, kuriame yra jūsų projektas. Rodyti vaizdų atsisiuntimo laiką, atėmus pabaigos laiką iš pradžios laiko.

pradžios_laikas = laikas.perf_skaitiklis()
dėl img_url in img_urls:
img_baitai = užklausos.get (img_url).turinys
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
su atidaryti (img_name, "wb") kaip img_file:
img_file.write (img_baitai)
spausdinti (f'{img_name} buvo atsisiųsta...“)
finišo_laikas = laikas.perf_skaitiklis()
spausdinti (f'Baigė {finish_time – start_time} sekundės')

Programa užtrunka maždaug 22 sekundes, kad atsisiųstų 12 vaizdų. Tai gali skirtis, nes vaizdų atsisiuntimo laikas taip pat priklauso nuo interneto greičio.

Modifikuokite programą, kad ji naudotų sriegimą naudodami concurrent.features modulį. Vietoj kilpos naudokite funkciją. Tai funkcija, kurią perkelsite į vykdytojas instancija.

importuoti prašymus
importuoti laikas
importuoti kartu.ateities

img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

pradžios_laikas = laikas.perf_skaitiklis()

defatsisiuntimo_vaizdas(img_url):
img_baitai = užklausos.get (img_url).turinys
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
su atidaryti (img_name, "wb") kaip img_file:
img_file.write (img_baitai)
spausdinti (f'{img_name} buvo atsisiųsta...“)

su kartu.ateities. ThreadPoolExecutor() kaip vykdytojas:
executor.map (atsisiųsti_vaizdą, img_urls)

finišo_laikas = laikas.perf_skaitiklis()

spausdinti (f'Baigė {finish_time-start_time} sekundės')

Įvedus sriegimą. Laikas žymiai sumažėja. Programos vykdymas užtruko tik 4 sekundes.

Sriegimui tinkami scenarijai

Kai kurie sriegimui tinkami scenarijai yra šie:

  • I/O susietos užduotys: jei programa didžiąją laiko dalį praleidžia laukdama, kol bus baigtos įvesties arba išvesties operacijos. Siūlymas gali pagerinti našumą, nes leidžia vykdyti kitas užduotis laukiant, kol bus baigtos įvesties / išvesties operacijos.
  • Tinklo grandymas: Žiniatinklio rinkimas apima HTTP užklausų pateikimą ir HTML atsakymų analizę. Sriegimas padeda pagreitinti procesą, nes vienu metu galite pateikti kelias užklausas.
  • CPU susietos užduotys: Siūlymas gali padėti pagerinti našumą, nes leidžia lygiagrečiai vykdyti kelias užduotis.

Susipažinkite su siūlais kitomis kalbomis

Python nėra vienintelė kalba, palaikanti gijų kūrimą. Dauguma programavimo kalbų palaiko tam tikrą gijų sujungimą. Svarbu susipažinti su gijų diegimu kitomis kalbomis. Taip įgysite reikiamų įgūdžių, kad galėtumėte įveikti įvairius scenarijus, kai gali būti taikomas sriegimas.