Lõimestamine vähendab oluliselt programmi täitmisaega. Siit saate teada, kuidas Pythonis lõimemist rakendada.
Täitmisaeg on programmi tõhususe üks levinumaid näitajaid. Mida kiirem on täitmisaeg, seda parem on programm. Keermestamine on tehnika, mis võimaldab programmil täita korraga mitut ülesannet või protsessi.
Saate teada, kuidas kasutada sisseehitatud Pythoni keermestamine moodul ja samaaegsed.omadused moodul. Mõlemad moodulid pakuvad lihtsaid viise lõimede loomiseks ja haldamiseks
Keermestamise tähtsus
Lõimestamine vähendab aega, mis programmil töö lõpetamiseks kulub. Kui töö sisaldab mitut sõltumatut ülesannet, saate ülesannete samaaegseks käitamiseks kasutada lõime, mis vähendab programmi ooteaega ühe ülesande täitmiseks enne järgmise juurde liikumist.
Näiteks programm, mis laadib Internetist alla mitu pildifaili. See programm võib failide paralleelseks allalaadimiseks kasutada niidimist, mitte ükshaaval. See välistab aja, mille programm peaks ootama ühe faili allalaadimise lõpuleviimist, enne kui järgmise juurde siirdub.
Esialgne programm enne keermestamist
Funktsioon järgmises programmis tähistab ülesannet. Ülesanne on peatada programmi täitmine üheks sekundiks. Programm kutsub funktsiooni kaks korda välja, luues seega kaks ülesannet. Seejärel arvutab see välja kogu programmi töötamiseks kulunud aja ja kuvab selle seejärel ekraanil.
importida aega
algusaeg = aeg.perf_counter()
defpaus():
print("Magasin 1 sekundi...")
time.sleep(1)
print("Magamine tehtud...")
paus ()
paus ()
finiši_aeg = aeg.perf_counter()
print(f'Lõpetas {ring (finish_time - start_time, 2)} teine (s)")
Väljund näitab, et programmi käivitamiseks kulus 2,01 sekundit. Iga ülesande täitmiseks kulus üks sekund ja ülejäänud koodi täitmiseks kulus 0,01 sekundit.
Mõlema ülesande samaaegseks täitmiseks saate kasutada lõime. Mõlema ülesande täitmiseks kulub üks sekund.
Keermestamise rakendamine Keermestamismooduli abil
Keermestamise rakendamiseks esialgse koodi muutmiseks importige keermestamine moodul. Loo kaks lõime, niit_1 ja niit_2 kasutades Niit klass. Helistage alustada meetod igas lõimes selle täitmise alustamiseks. Helistage liituda meetodit iga lõime jaoks, et oodata nende täitmise lõpuleviimist, enne kui ülejäänud programm käivitub.
importida aega
importida keermestamine
algusaeg = aeg.perf_counter()defpaus():
print("Magasin 1 sekundi...")
time.sleep(1)
print("Magamine tehtud...")niit_1 = keermestamine. Lõim (sihtmärk=paus)
niit_2 = keermestamine. Lõim (sihtmärk=paus)thread_1.start()
thread_2.start()thread_1.join()
thread_2.join()
finiši_aeg = aeg.perf_counter()
print(f'Lõpetas {ring (finish_time - start_time, 2)} teine (s)")
Programm käitab mõlemat lõime samaaegselt. See vähendab mõlema ülesande täitmiseks kuluvat aega.
Väljund näitab, et samade ülesannete täitmiseks kulub umbes sekund. See on pool ajast, kui esialgne programm kestis.
Keermestamise rakendamine mooduli concurrent.futures abil
Python 3.2 tutvustas samaaegne.futuur moodul. See moodul pakub kõrgetasemelist liidest asünkroonsete ülesannete täitmiseks lõimede abil. See pakub lihtsamat viisi ülesannete paralleelseks täitmiseks.
Algse programmi muutmiseks niidistamise kasutamiseks importige moodul concurrent.features. Kasuta ThreadPoolExecutor klassi moodulist concurrent.futures, et luua lõimede kogum. Esitage paus basseini kaks korda. The Esita meetod tagastab a tulevik objekt, mis esindab funktsiooni väljakutse tulemust.
Korda üle futuurid ja printige tulemused kasutades tulemus meetod.
importida aega
importida samaaegne.futuuralgusaeg = aeg.perf_counter()
defpaus():
print("Magasin 1 sekundi...")
time.sleep(1)
tagasi"Magamine tehtud..."koos samaaegne.futuur. ThreadPoolExecutor() nagu täitja:
tulemused = [executor.submit (paus) jaoks _ sisse vahemik(2)]
jaoks f sisse concurrent.futures.as_completed (tulemused):
print (f.result())finiši_aeg = aeg.perf_counter()
print(f'Lõpetas {ring (finish_time - start_time, 2)} teine (s)")
Moodul concurrent.features hoolitseb lõimede käivitamise ja ühendamise eest teie eest. See muudab teie koodi puhtamaks.
Väljund on identne keermestusmooduli väljundiga. Keermestamise moodul on kasulik lihtsate juhtumite korral, kus on vaja paralleelselt käivitada paar lõime. Teisest küljest on moodul concurrent.futures kasulik keerukamate juhtumite korral, kus peate samaaegselt käivitama palju ülesandeid.
Lõime kasutamine reaalses stsenaariumis
Lõimede kasutamine ülaltoodud programmi käivitamiseks vähendas aega ühe sekundi võrra. Päris maailmas säästavad lõimed rohkem aega. Looge programm, mis laadib Internetist pilte alla. Alusta sellest luua uus virtuaalne keskkond. Installimiseks käivitage terminalis järgmine käsk taotlusi raamatukogu:
pip installitaotlused
Päringute teek võimaldab teil saata HTTP-päringuid. Importige päringute teek ja ajateek.
importida taotlusi
importida aega
Looge nende piltide URL-ide loend, mida soovite alla laadida. Laske neil olla vähemalt kümme, et saaksite keermestamise rakendamisel märgata olulist erinevust.
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',
]
Liikuge loendist üle URL-idest, mis laadivad iga pildi alla samasse kausta, mis sisaldab teie projekti. Kuvage piltide allalaadimiseks kulunud aeg, lahutades algusajast lõpuaja.
algusaeg = aeg.perf_counter()
jaoks img_url sisse img_urls:
img_bytes = taotlused.get (img_url).sisu
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
koos avatud (pildi_nimi, 'wb') nagu img_file:
img_file.write (img_baiti)
print(f'{img_name} laaditi alla...')
finiši_aeg = aeg.perf_counter()
print(f'Lõpetas {finish_time – start_time} sekundit')
Programmil kulub 12 pildi allalaadimiseks umbes 22 sekundit. See võib teie jaoks erineda, kuna piltide allalaadimiseks kuluv aeg sõltub ka teie Interneti kiirusest.
Muutke programmi nii, et see kasutaks moodulit concurrent.features. Silmuse asemel kasutage funktsiooni. See on funktsioon, mille edastate testamenditäitja näiteks.
importida taotlusi
importida aega
importida samaaegne.futuurimg_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',
]algusaeg = aeg.perf_counter()
defdownload_image(img_url):
img_bytes = taotlused.get (img_url).sisu
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
koos avatud (pildi_nimi, 'wb') nagu img_file:
img_file.write (img_baiti)
print(f'{img_name} laaditi alla...')koos samaaegne.futuur. ThreadPoolExecutor() nagu täitja:
executor.map (allalaaditav_pilt, img_urls)finiši_aeg = aeg.perf_counter()
print(f'Lõpetas {finish_time-start_time} sekundit')
Pärast keermestamise tutvustamist. Aeg väheneb oluliselt. Programmi täitmiseks kulus vaid 4 sekundit.
Keermestamise jaoks sobivad stsenaariumid
Mõned keermestamiseks sobivad stsenaariumid on järgmised:
- I/O seotud ülesanded: kui programm kulutab suurema osa ajast sisend- või väljundtoimingute lõpetamist oodates. Lõimestamine võib jõudlust parandada, lubades sisend-/väljundtoimingute lõpuleviimist oodates muid ülesandeid täita.
- Veebi kraapimine: Veebi kraapimine hõlmab HTTP-päringute tegemist ja HTML-i vastuste sõelumist. Lõimestamine aitab protsessi kiirendada, võimaldades teil samaaegselt esitada mitu taotlust.
- CPU-ga seotud ülesanded: Lõimestamine võib aidata jõudlust parandada, võimaldades mitmel ülesandel paralleelselt täita.
Viige end kurssi teiste keelte lõimimisega
Python pole ainus keel, mis toetab lõime. Enamik programmeerimiskeeli toetab mõnda keermestamist. Oluline on tutvuda lõimede rakendamisega teistes keeltes. See annab teile vajalikud oskused, et tulla toime erinevate stsenaariumidega, kus keermestamine võib kehtida.