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.
LockdanRLockmelindungi bagian kritis.queue.Queueaman untuk utas; gunakanmultiprocessing.Queueantarproses.Eventmengirim 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
- Thread dan GIL
- ThreadPoolExecutor
- Dasar-Dasar multiprocessing
- Berbagi Data dengan Aman