Säikeet ja GIL
Ymmärrä Python-säikeistyksen rajoitukset
Säikeet ja GIL on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.
Mikä on säie
Säie on erillinen suorituspolku yhden prosessin sisällä. Pythonin threading-moduulilla voitte suorittaa funktioita samanaikaisesti yhden ohjelman sisällä.
import threading
def worker():
print('hello from thread')
t = threading.Thread(target=worker)
t.start()
t.join()
print('main done')Useiden säikeiden käynnistäminen
Voitte käynnistää useita säikeitä. Kukin suorittaa sille määritetyn kohdefunktion. join() saa pääsäikeen odottamaan, kunnes säie päättyy.
import threading
def task(name):
print('task', name)
threads = [threading.Thread(target=task, args=(i,)) for i in range(3)]
for t in threads:
t.start()
for t in threads:
t.join()
print('all finished')Python-tulkin globaali lukko
CPythonissa on Global Interpreter Lock (GIL) eli globaali tulkin lukko: vain yksi säie suorittaa Python-tavukoodia kerrallaan. Siksi säikeet eivät nopeuta puhdasta Python-koodia suorittavaa CPU-työtä aidosti rinnakkain.
import sys
print('Running on:', sys.implementation.name)
print('Only one thread runs Python bytecode at a time due to the GIL')Milloin säikeistä on hyötyä
Säikeet sopivat erinomaisesti I/O-sidonnaiseen työhön, kuten verkkopyyntöihin, levyltä lukemiseen ja odottamiseen. Kun yksi säie odottaa, GIL vapautetaan ja toinen säie voi suorittaa koodia.
import threading, time
def fake_io(name):
time.sleep(0.1)
print('done', name)
start = time.perf_counter()
ts = [threading.Thread(target=fake_io, args=(i,)) for i in range(3)]
for t in ts: t.start()
for t in ts: t.join()
print('elapsed about 0.1s, not 0.3s')CPU-sidonnainen työ ei nopeudu
Raskaassa laskennassa säikeiden lisääminen ei nopeuta suoritusta, koska GIL suorittaa ne sarjallisesti. Käyttäkää CPU-työhön sen sijaan multiprocessing-moduulia.
import threading
def burn():
total = 0
for i in range(1000000):
total += i
return total
t = threading.Thread(target=burn)
t.start()
t.join()
print('CPU-bound: threads share one core under the GIL')Daemon-säikeet
Daemon-säie lopetetaan automaattisesti, kun pääohjelma päättyy. Käyttäkää sitä taustalla toimiviin apureihin, joiden valmistumista ei tarvitse odottaa.
import threading, time
def background():
time.sleep(0.05)
print('background tick')
t = threading.Thread(target=background, daemon=True)
t.start()
t.join()
print('main exits')Säikeiden nimeäminen ja tunnistaminen
Jokaisella säikeellä on nimi ja tunniste. threading.current_thread() palauttaa parhaillaan suoritettavan säieolion, mikä on kätevää lokituksessa.
import threading
def show():
t = threading.current_thread()
print('running in', t.name)
t = threading.Thread(target=show, name='Worker-1')
t.start()
t.join()
print('main thread:', threading.current_thread().name)Thread-luokan periyttäminen
Kohteen välittämisen sijaan voitte periä luokan Thread ja korvata sen run()-metodin. Tämä on hyödyllistä, kun säie tarvitsee oman tilansa.
import threading
class Greeter(threading.Thread):
def __init__(self, name):
super().__init__()
self.who = name
def run(self):
print('hi', self.who)
g = Greeter('Sam')
g.start()
g.join()Tulosten palauttaminen säikeistä
Kohdefunktion palauttama arvo hylätään. Voitte kerätä tulokset kirjoittamalla ne jaettuun tietorakenteeseen. Myöhemmin tutustutte turvallisempiin työkaluihin, kuten jonoihin.
import threading
results = {}
def compute(key):
results[key] = key * key
ts = [threading.Thread(target=compute, args=(i,)) for i in range(4)]
for t in ts: t.start()
for t in ts: t.join()
print(results)Aktiivisten säikeiden laskeminen
threading.active_count() kertoo parhaillaan elossa olevien säikeiden määrän pääsäie mukaan lukien.
import threading, time
def wait():
time.sleep(0.05)
ts = [threading.Thread(target=wait) for _ in range(2)]
for t in ts: t.start()
print('active now:', threading.active_count())
for t in ts: t.join()
print('active after join:', threading.active_count())Säikeiden ja prosessien valitseminen
Nyrkkisääntö: käyttäkää säikeitä I/O-sidonnaiseen samanaikaisuuteen ja prosesseja CPU-sidonnaiseen rinnakkaisuuteen. Syynä on GIL.
tasks = {'download files': 'threads', 'crunch numbers': 'processes', 'call APIs': 'threads'}
for task, choice in tasks.items():
print(task, '->', choice)Pikatarkistus
Testatkaa ymmärrystänne säikeistä ja GIL:stä.
Kertaus
Opitte säikeistä ja GIL:stä:
- Säikeet suoritetaan samanaikaisesti yhden prosessin sisällä käyttämällä
threading.Thread-luokkaa. - GIL suorittaa Python-tavukoodin sarjallisesti.
- Säikeet auttavat I/O-sidonnaisessa työssä ja prosessit CPU-sidonnaisessa työssä.
- Käyttäkää
start()- jajoin()-metodeja, daemon-säikeitä sekä periyttämistä.
Seuraavaksi opitte hallitsemaan säikeitä siististi ThreadPoolExecutorilla.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 76
- Oppitunnit
- 320
Usein kysytyt kysymykset
Onko oppitunti ”Säikeet ja GIL” ilmainen?
Kyllä – oppitunnin ”Säikeet ja GIL” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Säikeet ja GIL”?
Ymmärrä Python-säikeistyksen rajoitukset Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Säikeet ja GIL”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?
Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.