0Pricing
Ruby Academy · Pelajaran

Thread

Eksekusi konkuren.

Thread adalah pelajaran Ruby 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 Ruby Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Ruby Academy mencakup 4 pelajaran total.

Apa Itu Utas

Utas adalah jalur eksekusi independen di dalam program Anda. Ruby memungkinkan Anda menjalankan beberapa utas sehingga pekerjaan dapat berlangsung secara tumpang tindih.

  • Program utama berjalan di utas utama.
  • Anda membuat utas tambahan dengan Thread.new.
  • Utas berbagi memori yang sama, sehingga dapat membaca dan menulis variabel yang sama.

Utas sangat ideal ketika program Anda menghabiskan waktu untuk menunggu (jaringan, disk, tidur), karena satu utas dapat menunggu sementara utas lainnya terus bekerja.

Membuat Utas

Teruskan sebuah blok ke Thread.new. Blok tersebut berjalan di utas baru. Panggil join untuk menunggunya selesai sebelum program berakhir.

t = Thread.new do
  puts "Hello from the new thread"
end

t.join
puts "Main thread done"

Mengapa join Penting

Ketika utas utama berakhir, Ruby keluar dan mungkin tidak menunggu utas lainnya. join akan memblokir pemanggil hingga utas yang dituju selesai.

Tanpa join, utas pekerja mungkin tidak pernah mendapat kesempatan untuk mencetak hasil sebelum program berhenti.

t = Thread.new do
  sleep 0.1
  puts "Worker finished"
end

puts "Waiting..."
t.join
puts "All done"

Banyak Utas Sekaligus

Anda dapat menjalankan sekelompok utas, mengumpulkannya ke dalam array, lalu memanggil join pada setiap utas. Ini adalah pola umum untuk pekerjaan I/O yang kurang lebih paralel.

threads = (1..3).map do |n|
  Thread.new do
    puts "Thread number " + n.to_s
  end
end

threads.each(&:join)
puts "Finished all threads"

Berbagi Variabel

Utas berbagi memori. Variabel yang ditentukan sebelum utas dibuat akan terlihat di dalamnya. Hal ini sangat berguna, tetapi juga berbahaya jika dua utas menulis nilai yang sama.

counter = 0

t = Thread.new do
  counter += 1
end

t.join
puts "Counter is " + counter.to_s

Kondisi Balapan

Kondisi balapan terjadi ketika utas menyelipkan pembaruan pada data bersama dan hasilnya bergantung pada waktu pelaksanaannya.

  • counter += 1 sebenarnya terdiri dari operasi baca, tambah, lalu tulis.
  • Dua utas dapat membaca nilai lama yang sama dan sama-sama menulis nilai baru yang sama, sehingga salah satu penambahan hilang.

Solusinya adalah mengoordinasikan akses dengan pengunci.

Mutex: Pengunci

Mutex (eksklusi mutual) memastikan hanya satu utas yang menjalankan kode yang dilindungi pada satu waktu. Bungkus bagian kritis dengan mutex.synchronize.

mutex = Mutex.new
counter = 0

threads = (1..5).map do
  Thread.new do
    mutex.synchronize do
      counter += 1
    end
  end
end

threads.each(&:join)
puts "Counter is " + counter.to_s

Mengembalikan Nilai

Thread#value menunggu utas selesai dan mengembalikan nilai dari bloknya, seperti join otomatis yang sekaligus mengembalikan hasil.

t = Thread.new do
  2 + 3
end

puts "Result is " + t.value.to_s

Variabel Lokal Utas

Setiap utas dapat menyimpan nilainya sendiri yang diakses berdasarkan simbol dengan Thread.current[:key]. Nilai-nilai ini bersifat pribadi bagi utas tersebut dan tidak pernah dibagikan.

t = Thread.new do
  Thread.current[:name] = "worker"
  puts "Inside: " + Thread.current[:name]
end

t.join

Menangani Eksepsi

Jika sebuah utas menimbulkan kesalahan, kesalahan tersebut tetap diam hingga Anda memanggil join atau value, yang akan menimbulkannya kembali. Mengatur Thread.abort_on_exception = true membuat kesalahan langsung menghentikan seluruh program, sehingga membantu proses penelusuran kesalahan.

t = Thread.new do
  raise "boom"
end

begin
  t.join
rescue => e
  puts "Caught: " + e.message
end

Kapan Utas Membantu

Utas sangat efektif untuk pekerjaan yang bergantung pada I/O, yaitu pekerjaan yang waktunya banyak dihabiskan untuk menunggu. Utas kurang membantu untuk pekerjaan yang bergantung pada CPU karena adanya GVL, yang akan dibahas berikutnya.

  • Baik: mengunduh banyak URL dan membaca banyak berkas.
  • Terbatas: melakukan perhitungan numerik intensif di banyak inti.

Selalu lindungi status bersama yang dapat diubah dengan Mutex.

Pemeriksaan Singkat

Uji pemahaman Anda tentang utas.

Rangkuman: Utas

Anda telah mempelajari dasar-dasar utas Ruby:

  • Thread.new memulai eksekusi konkuren.
  • join menunggu; value menunggu dan mengembalikan hasil.
  • Utas berbagi memori, yang dapat menyebabkan kondisi balapan.
  • Mutex dengan synchronize melindungi status bersama.
  • Utas sangat baik untuk pekerjaan yang bergantung pada I/O.

Selanjutnya kita akan menjelajahi alasan utas tidak dapat sepenuhnya menggunakan beberapa inti CPU: GVL.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Thread” gratis?

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

Apa yang akan aku pelajari di “Thread”?

Eksekusi konkuren. Kamu berlatih Ruby 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 Ruby Academy?

Tidak diperlukan pengalaman sebelumnya. Ruby 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” 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 Ruby Academy ini?

Ya. Setiap pelajaran Ruby 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
  2. Penjelasan GVL
  3. Fiber
  4. Ractor
← Kembali ke Ruby Academy