0Pricing
Python Academy · Pelajaran

Thread dan GIL

Pahami batasan threading Python

Thread dan GIL adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.

Apa Itu Utas?

Utas adalah alur eksekusi terpisah di dalam satu proses. Modul threading Python memungkinkan Anda menjalankan fungsi secara bersamaan dalam satu program.

import threading

def worker():
    print('hello from thread')

t = threading.Thread(target=worker)
t.start()
t.join()
print('main done')

Memulai Beberapa Utas

Anda dapat meluncurkan beberapa utas. Masing-masing menjalankan fungsi targetnya. join() membuat utas utama menunggu hingga suatu utas selesai.

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')

Kunci Interpreter Global

CPython memiliki Kunci Interpreter Global (GIL): hanya satu utas yang menjalankan bytecode Python pada satu waktu. Artinya, utas tidak memberikan peningkatan kecepatan paralel yang sebenarnya untuk pekerjaan CPU murni dalam Python.

import sys
print('Running on:', sys.implementation.name)
print('Only one thread runs Python bytecode at a time due to the GIL')

Kapan Utas Tetap Membantu

Utas sangat cocok untuk pekerjaan yang terikat I/O: permintaan jaringan, pembacaan disk, dan penantian. Saat satu utas menunggu, GIL dilepas sehingga utas lain dapat berjalan.

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')

Pekerjaan Terikat CPU Tidak Menjadi Lebih Cepat

Untuk perhitungan berat, menambahkan utas tidak akan membuatnya lebih cepat karena GIL menjalankan utas secara bergiliran. Untuk pekerjaan CPU, gunakan multiprocessing sebagai gantinya.

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')

Utas Daemon

Utas daemon dihentikan secara otomatis saat program utama berakhir. Gunakan utas ini untuk pembantu latar belakang yang tidak perlu Anda tunggu.

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')

Memberi Nama dan Mengidentifikasi Utas

Setiap utas memiliki nama dan ID. threading.current_thread() mengembalikan objek utas yang sedang berjalan, yang berguna untuk pencatatan.

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)

Membuat Subkelas Thread

Alih-alih meneruskan target, Anda dapat membuat subkelas dari Thread dan mengganti run(). Cara ini berguna saat suatu utas memerlukan keadaannya sendiri.

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()

Mengembalikan Hasil dari Utas

Nilai yang dikembalikan fungsi target akan dibuang. Untuk mengumpulkan hasil, tuliskan hasil tersebut ke dalam struktur bersama (nanti Anda akan melihat alat yang lebih aman, seperti antrean).

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)

Menghitung Utas Aktif

threading.active_count() memberi tahu jumlah utas yang sedang hidup, termasuk utas utama.

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())

Memilih Utas vs Proses

Aturan praktisnya: gunakan utas untuk konkurensi yang terikat I/O dan proses untuk paralelisme yang terikat CPU. GIL adalah alasannya.

tasks = {'download files': 'threads', 'crunch numbers': 'processes', 'call APIs': 'threads'}
for task, choice in tasks.items():
    print(task, '->', choice)

Pemeriksaan Singkat

Uji pemahaman Anda tentang utas dan GIL.

Ringkasan

Anda telah mempelajari utas dan GIL:

  • Utas berjalan secara bersamaan di dalam satu proses melalui threading.Thread.
  • GIL menjalankan eksekusi bytecode Python secara bergiliran.
  • Utas membantu pekerjaan yang terikat I/O; proses membantu pekerjaan yang terikat CPU.
  • Gunakan start(), join(), utas daemon, dan pewarisan subkelas.

Selanjutnya: mengelola utas dengan rapi menggunakan ThreadPoolExecutor.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Thread dan GIL” gratis?

Ya — teks lengkap “Thread dan GIL” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Thread dan GIL”?

Pahami batasan threading Python Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Python Academy?

Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Thread dan GIL” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Thread dan GIL
  2. ThreadPoolExecutor
  3. Dasar-Dasar multiprocessing
  4. Berbagi Data dengan Aman
← Kembali ke Python Academy