0Pricing
Python Academy · Pelajaran

Berbagi Data dengan Aman

Gunakan antrean dan kunci

Berbagi Data dengan Aman adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Masalah Kondisi Balapan

Ketika beberapa utas mengubah data yang sama, operasi mereka dapat saling menyela dan merusak hasil. Ini disebut kondisi balapan. Kita memerlukan alat sinkronisasi untuk berbagi data dengan aman.

import threading

counter = 0

def bump():
    global counter
    for _ in range(100000):
        counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter (may be < 200000):', counter)

Lock sebagai Solusi

threading.Lock memastikan hanya satu utas yang memasuki bagian kritis pada satu waktu. Dapatkan kunci tersebut dengan blok with yang membungkus pembaruan data bersama.

import threading

counter = 0
lock = threading.Lock()

def bump():
    global counter
    for _ in range(100000):
        with lock:
            counter += 1

ts = [threading.Thread(target=bump) for _ in range(2)]
for t in ts: t.start()
for t in ts: t.join()
print('counter:', counter)

acquire dan release

Kunci dapat digunakan secara manual dengan acquire() dan release(), tetapi bentuk with lebih aman karena kunci akan dilepaskan meskipun terjadi kesalahan.

import threading

lock = threading.Lock()
lock.acquire()
try:
    print('inside critical section')
finally:
    lock.release()
print('released')

Antrean yang Aman untuk Utas

Kelas queue.Queue sudah aman untuk utas. Utas dapat melakukan put dan get tanpa kunci eksplisit, sehingga cara ini lebih disarankan untuk meneruskan data.

import queue, threading

q = queue.Queue()

def producer():
    for i in range(3):
        q.put(i)

t = threading.Thread(target=producer)
t.start()
t.join()
while not q.empty():
    print('got', q.get())

Producer dan Consumer

Pola klasiknya: produsen memasukkan pekerjaan dengan put ke dalam antrean, sedangkan konsumen mengambil dan memprosesnya dengan get. Antrean menangani semua penguncian.

import queue, threading

q = queue.Queue()
results = []

def consumer():
    while True:
        item = q.get()
        if item is None:
            break
        results.append(item * 10)
        q.task_done()

t = threading.Thread(target=consumer)
t.start()
for i in range(3):
    q.put(i)
q.put(None)
t.join()
print(results)

join dan task_done

q.join() memblokir sampai setiap item yang telah dimasukkan dengan put memiliki pemanggilan task_done() yang sesuai. Ini memungkinkan utas utama menunggu sampai semua pekerjaan selesai.

import queue, threading

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        q.task_done()

threading.Thread(target=worker, daemon=True).start()
for i in range(5):
    q.put(i)
q.join()
print('all items processed')

RLock untuk Akses Ulang

Lock biasa mengalami kebuntuan jika utas yang sama mencoba mendapatkannya dua kali. threading.RLock (kunci yang dapat dimasuki ulang) mengizinkan hal itu dengan menghitung setiap perolehan kunci.

import threading

rlock = threading.RLock()

def outer():
    with rlock:
        inner()

def inner():
    with rlock:
        print('re-entered safely')

outer()

Event untuk Pensinyalan

threading.Event memungkinkan satu utas memberi sinyal kepada utas lainnya. Utas memanggil wait() sampai utas lain memanggil set().

import threading

start = threading.Event()

def worker():
    start.wait()
    print('go!')

t = threading.Thread(target=worker)
t.start()
print('setting event')
start.set()
t.join()

Berbagi Data Antarproses

Untuk berbagi data antarproses, gunakan multiprocessing.Queue. Alat ini membuat serialisasi objek di antara ruang memori yang terpisah.

import multiprocessing as mp

def producer(q):
    for i in range(3):
        q.put(i * i)

if __name__ == '__main__':
    q = mp.Queue()
    p = mp.Process(target=producer, args=(q,))
    p.start()
    p.join()
    while not q.empty():
        print('received', q.get())

Menghindari Kebuntuan

Kebuntuan terjadi ketika utas menunggu kunci milik satu sama lain tanpa batas. Hindari hal ini dengan selalu mendapatkan beberapa kunci dalam urutan yang sama di semua tempat.

import threading

lock_a = threading.Lock()
lock_b = threading.Lock()

def safe():
    with lock_a:
        with lock_b:
            print('acquired in consistent order')

safe()

Utamakan Antrean daripada Lock

Jika memungkinkan, utamakan pertukaran pesan melalui antrean daripada status yang dapat diubah bersama dan dilindungi oleh kunci. Cara ini lebih mudah dipahami dan jauh lebih kecil kemungkinannya menimbulkan kesalahan.

import queue

q = queue.Queue()
for word in ['safe', 'simple', 'clear']:
    q.put(word)
while not q.empty():
    print(q.get())

Pemeriksaan Singkat

Uji pemahaman Anda tentang berbagi data dengan aman.

Ringkasan

Anda mempelajari cara berbagi data dengan aman:

  • Kondisi balapan merusak status bersama yang tidak dilindungi.
  • Lock dan RLock melindungi bagian kritis.
  • queue.Queue aman untuk utas; gunakan multiprocessing.Queue antarproses.
  • Event mengirim sinyal antarutas; urutan kunci yang konsisten mencegah kebuntuan.

Kursus berikutnya: menjalankan program eksternal dengan subprocess.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Berbagi Data dengan Aman” gratis?

Ya — teks lengkap “Berbagi Data dengan Aman” 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 “Berbagi Data dengan Aman”?

Gunakan antrean dan kunci 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 4 dari 4.

Berapa lama pelajaran “Berbagi Data dengan Aman” 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