Python Academy · Oppitunti

Säikeet ja GIL

Ymmärrä Python-säikeistyksen rajoitukset

Oppitunti 1/413 vaihetta

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()- ja join()-metodeja, daemon-säikeitä sekä periyttämistä.

Seuraavaksi opitte hallitsemaan säikeitä siististi ThreadPoolExecutorilla.

Aloita maksutta

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.

Kaikki tämän kurssin oppitunnit

  1. Säikeet ja GIL
  2. ThreadPoolExecutor
  3. multiprocessing-perusteet
  4. Tietojen turvallinen jakaminen
← Takaisin: Python Academy