Säiketys lyhentää merkittävästi ohjelman suoritusaikaa. Opi toteuttamaan ketjuttaminen Pythonissa.
Suoritusaika on yksi yleisimmistä ohjelman tehokkuuden mittareista. Mitä nopeampi suoritusaika, sitä parempi ohjelma. Threading on tekniikka, jonka avulla ohjelma voi suorittaa useita tehtäviä tai prosesseja samanaikaisesti.
Opit käyttämään sisäänrakennettua Python-ohjelmaa langoitus moduuli ja samanaikaiset.ominaisuudet moduuli. Molemmat moduulit tarjoavat yksinkertaisia tapoja luoda ja hallita säikeitä
Lankauksen merkitys
Säiketys vähentää aikaa, joka ohjelmalta kuluu työn suorittamiseen. Jos työ sisältää useita itsenäisiä tehtäviä, voit käyttää ketjutusta tehtävien suorittamiseen samanaikaisesti, mikä lyhentää ohjelman odotusaikaa yhden tehtävän valmistumiseen ennen siirtymistä seuraavaan.
Esimerkiksi ohjelma, joka lataa useita kuvatiedostoja Internetistä. Tämä ohjelma voi käyttää ketjutusta tiedostojen lataamiseen rinnakkain eikä yksitellen. Tämä eliminoi ajan, jonka ohjelman olisi odotettava yhden tiedoston latausprosessin valmistumista ennen siirtymistä seuraavaan.
Ensimmäinen ohjelma ennen langoitusta
Seuraavan ohjelman funktio edustaa tehtävää. Tehtävänä on keskeyttää ohjelman suoritus yhdeksi sekunniksi. Ohjelma kutsuu funktiota kahdesti ja luo näin kaksi tehtävää. Sitten se laskee ajan, joka kului koko ohjelman suorittamiseen, ja näyttää sen sitten näytöllä.
tuonti aika
aloitusaika = aika.perf_counter()
deftauko():
Tulosta("Nukkuu 1 sekunti...")
time.sleep(1)
Tulosta("Nukkuminen on valmis...")
tauko()
tauko()
lopetusaika = aika.perf_counter()
Tulosta(f'Valmis {kierros (lopetusaika - aloitusaika, 2)} toinen (s)')
Tulos näyttää, että ohjelman suorittaminen kesti 2,01 sekuntia. Jokainen tehtävä kesti yhden sekunnin ja muun koodin suorittaminen 0,01 sekuntia.
Voit käyttää ketjutusta molempien tehtävien suorittamiseen samanaikaisesti. Molempien tehtävien suorittaminen kestää yhden sekunnin.
Kierteityksen toteuttaminen langoitusmoduulin avulla
Jos haluat muokata alkuperäistä koodia ketjutuksen toteuttamiseksi, tuo langoitus moduuli. Luo kaksi lankaa, lanka_1 ja lanka_2 käyttämällä Lanka luokkaa. Soita alkaa menetelmä jokaisessa säikeessä aloittaaksesi sen suorittamisen. Soita liittyä seuraan menetelmää kussakin säikeessä odottamaan niiden suorittamisen valmistumista ennen kuin muu ohjelma suoritetaan.
tuonti aika
tuonti langoitus
aloitusaika = aika.perf_counter()deftauko():
Tulosta("Nukkuu 1 sekunti...")
time.sleep(1)
Tulosta("Nukkuminen on valmis...")lanka_1 = lanka. Säie (target=tauko)
lanka_2 = lanka. Säie (target=tauko)thread_1.start()
thread_2.start()thread_1.join()
thread_2.join()
lopetusaika = aika.perf_counter()
Tulosta(f'Valmis {kierros (lopetusaika - aloitusaika, 2)} toinen (s)')
Ohjelma ajaa molemmat säikeet samanaikaisesti. Tämä vähentää molempien tehtävien suorittamiseen kuluvaa aikaa.
Tulos näyttää, että samojen tehtävien suorittamiseen kuluu noin sekunti. Tämä on puolet alkuperäisen ohjelman ajasta.
Lankauksen toteuttaminen concurrent.futures-moduulin avulla
Python 3.2 otettiin käyttöön concurrent.futures moduuli. Tämä moduuli tarjoaa korkean tason käyttöliittymän asynkronisten tehtävien suorittamiseen säikeiden avulla. Se tarjoaa yksinkertaisemman tavan suorittaa tehtäviä rinnakkain.
Jos haluat muokata alkuperäistä ohjelmaa käyttämään ketjutusta, tuo concurrent.features-moduuli. Käytä ThreadPoolExecutor luokka concurrent.futures-moduulista luodaksesi lankajoukon. Lähetä tauko käydä uima-altaalla kahdesti. The Lähetä menetelmä palauttaa a tulevaisuutta objekti, joka edustaa funktiokutsun tulosta.
Toista yli futuurit ja tulostaa tulokset käyttämällä tulos menetelmä.
tuonti aika
tuonti concurrent.futuresaloitusaika = aika.perf_counter()
deftauko():
Tulosta("Nukkuu 1 sekunti...")
time.sleep(1)
palata"Nukkuminen on valmis..."kanssa concurrent.futures. ThreadPoolExecutor() kuten toimeenpanija:
tulokset = [executor.submit (tauko) varten _ sisään range(2)]
varten f sisään concurrent.futures.as_completed (tulokset):
tulosta (f.result())lopetusaika = aika.perf_counter()
Tulosta(f'Valmis {kierros (lopetusaika - aloitusaika, 2)} toinen (s)')
Concurrent.features-moduuli huolehtii säikeiden käynnistämisestä ja yhdistämisestä puolestasi. Tämä tekee koodistasi puhtaamman.
Lähtö on identtinen kierteitysmoduulin kanssa. Kierteitysmoduuli on hyödyllinen yksinkertaisissa tapauksissa, joissa joudut ajamaan muutaman säikeen rinnakkain. Toisaalta concurrent.futures-moduuli on hyödyllinen monimutkaisemmissa tapauksissa, joissa sinun on suoritettava useita tehtäviä samanaikaisesti.
Threadingin käyttäminen tosimaailmassa
Säikeiden käyttäminen yllä olevan ohjelman suorittamiseen lyhensi aikaa yhdellä sekunnilla. Todellisessa maailmassa säikeet säästävät enemmän aikaa. Luo ohjelma, joka lataa kuvia Internetistä. Aloita uuden virtuaaliympäristön luominen. Suorita seuraava komento terminaalissa asentaaksesi pyynnöt kirjasto:
pip-asennuspyynnöt
Pyyntökirjaston avulla voit lähettää HTTP-pyyntöjä. Tuo pyyntökirjasto ja aikakirjasto.
tuonti pyynnöt
tuonti aika
Luo luettelo ladattavien kuvien URL-osoitteista. Anna niiden olla vähintään kymmenen, jotta huomaat merkittävän eron, kun käytät lankaa.
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',
]
Selaa luetteloa URL-osoitteista, jotka lataavat jokaisen kuvan samaan kansioon, joka sisältää projektisi. Näytä kuvien lataamiseen kulunut aika vähentämällä lopetusaika aloitusajasta.
aloitusaika = aika.perf_counter()
varten img_url sisään img_urls:
img_bytes = requests.get (img_url).content
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
kanssa avaa (kuvan_nimi, 'wb') kuten img_file:
img_file.write (img_bytes)
Tulosta(f'{img_name} ladattiin...')
lopetusaika = aika.perf_counter()
Tulosta(f'Valmis {lopetusaika - aloitusaika} sekuntia')
Ohjelmalla kestää noin 22 sekuntia ladata 12 kuvaa. Se voi vaihdella, koska kuvien lataamiseen kuluva aika riippuu myös Internetin nopeudesta.
Muokkaa ohjelmaa käyttämään ketjutusta concurrent.features-moduulin avulla. Käytä silmukan sijasta funktiota. Tämä on toiminto, jonka siirrät toimeenpanija ilmentymä.
tuonti pyynnöt
tuonti aika
tuonti concurrent.futuresimg_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',
]aloitusaika = aika.perf_counter()
defdownload_image(img_url):
img_bytes = requests.get (img_url).content
img_name = img_url.split('/')[3]
img_name = f'{img_name}.jpg'
kanssa avaa (kuvan_nimi, 'wb') kuten img_file:
img_file.write (img_bytes)
Tulosta(f'{img_name} ladattiin...')kanssa concurrent.futures. ThreadPoolExecutor() kuten toimeenpanija:
executor.map (latauskuva, img_urls)lopetusaika = aika.perf_counter()
Tulosta(f'Valmis {lopetusaika-aloitusaika} sekuntia')
Kierteityksen käyttöönoton jälkeen. Aika lyhenee huomattavasti. Ohjelman suorittaminen kesti vain 4 sekuntia.
Langatukseen sopivat skenaariot
Jotkut kierteitykseen soveltuvista skenaarioista ovat:
- I/O-sidotut tehtävät: Jos ohjelma viettää suurimman osan ajasta odottaessaan syöttö- tai tulostustoimintojen valmistumista. Säiketys voi parantaa suorituskykyä sallimalla muiden tehtävien suorittamisen odottaessaan I/O-toimintojen valmistumista.
- Webin kaapiminen: Web-kaappaus sisältää HTTP-pyyntöjen tekemisen ja HTML-vastausten jäsentämisen. Threading auttaa nopeuttamaan prosessia, koska voit tehdä useita pyyntöjä samanaikaisesti.
- Suorittimeen sidotut tehtävät: Säiketys voi parantaa suorituskykyä sallimalla useiden tehtävien suorittamisen rinnakkain.
Tutustu muilla kielillä kirjoittamiseen
Python ei ole ainoa kieli, joka tukee ketjutusta. Useimmat ohjelmointikielet tukevat jonkinlaista ketjutusta. On tärkeää tutustua muiden kielten säikeiden toteutukseen. Tämä antaa sinulle tarvittavat taidot selviytyäksesi erilaisista skenaarioista, joissa langoitus saattaa päteä.