İş Parçacıkları
Eşzamanlı yürütme
İş Parçacıkları, CoddyKit'te ücretsiz bir Ruby Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Ruby Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Ruby Academy kursu toplamda 4 dersten oluşur.
İş Parçacığı Nedir?
Bir iş parçacığı, programınızın içindeki bağımsız bir yürütme yoludur. Ruby, işlerin zaman bakımından örtüşebilmesi için birkaç iş parçacığını çalıştırmanıza olanak tanır.
- Ana program ana iş parçacığında çalışır.
Thread.newile daha fazla iş parçacığı oluşturursunuz.- İş parçacıkları aynı belleği paylaşır; bu nedenle aynı değişkenleri okuyup yazabilirler.
İş parçacıkları, programınızın bekleyerek zaman geçirdiği durumlar (ağ, disk, uyku) için idealdir; çünkü bir iş parçacığı beklerken diğeri çalışmaya devam edebilir.
İş Parçacığı Oluşturma
Thread.new öğesine bir blok geçirin. Blok yeni bir iş parçacığında çalışır. Program çıkmadan önce tamamlanmasını beklemek için join çağrısı yapın.
t = Thread.new do
puts "Hello from the new thread"
end
t.join
puts "Main thread done"join Neden Önemlidir
Ana iş parçacığı sona erdiğinde Ruby çıkar ve diğer iş parçacıklarını beklemeyebilir. join, hedef iş parçacığı tamamlanana kadar çağıran iş parçacığını engeller.
join olmadan çalışan iş parçacığı, program kapanmadan önce çıktı yazdırma fırsatı bulamayabilir.
t = Thread.new do
sleep 0.1
puts "Worker finished"
end
puts "Waiting..."
t.join
puts "All done"Aynı Anda Birçok İş Parçacığı
Bir iş parçacığı grubu başlatabilir, bunları bir dizide toplayabilir ve ardından her birinde join çağrısı yapabilirsiniz. Bu, yaklaşık paralel G/Ç işleri için yaygın bir kalıptır.
threads = (1..3).map do |n|
Thread.new do
puts "Thread number " + n.to_s
end
end
threads.each(&:join)
puts "Finished all threads"Değişkenleri Paylaşma
İş parçacıkları belleği paylaşır. İş parçacığından önce tanımlanan bir değişken, iş parçacığının içinde görünür. Bu güçlü bir özelliktir; ancak iki iş parçacığı aynı değeri yazarsa tehlikeli olabilir.
counter = 0
t = Thread.new do
counter += 1
end
t.join
puts "Counter is " + counter.to_sYarış Durumları
Yarış durumu, iş parçacıkları paylaşılan verilerdeki güncellemeleri iç içe yürüttüğünde ve sonucun zamanlamaya bağlı olduğu durumda ortaya çıkar.
counter += 1aslında okuma, toplama ve yazma işlemlerinden oluşur.- İki iş parçacığı aynı eski değeri okuyup aynı yeni değeri yazabilir; bu durumda artırmalardan biri kaybolur.
Çözüm, erişimi bir kilitle koordine etmektir.
Mutex: Bir Kilit
Bir Mutex (karşılıklı dışlama), korunan kodu aynı anda yalnızca bir iş parçacığının çalıştırmasını sağlar. Kritik bölümü mutex.synchronize içine alın.
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_sDeğer Döndürme
Thread#value, iş parçacığının tamamlanmasını bekler ve bloğunun değerini döndürür; bu, otomatik bir join ile sonucun birleşimi gibidir.
t = Thread.new do
2 + 3
end
puts "Result is " + t.value.to_sİş Parçacığına Özel Değişkenler
Her iş parçacığı, sembol anahtarlarıyla kendi değerlerini Thread.current[:key] kullanarak saklayabilir. Bu değerler ilgili iş parçacığına özeldir ve hiçbir zaman paylaşılmaz.
t = Thread.new do
Thread.current[:name] = "worker"
puts "Inside: " + Thread.current[:name]
end
t.joinÖzel Durumları Ele Alma
Bir iş parçacığı hata oluşturursa bu hata, hatayı yeniden yükselten join veya value çağrılana kadar sessiz kalır. Thread.abort_on_exception = true ayarlandığında hatalar tüm programı hemen çökertir; bu da hata ayıklamaya yardımcı olur.
t = Thread.new do
raise "boom"
end
begin
t.join
rescue => e
puts "Caught: " + e.message
endİş Parçacıkları Ne Zaman Yardımcı Olur
İş parçacıkları, zamanın bekleyerek geçirildiği G/Ç ağırlıklı işlerde çok etkilidir. CPU ağırlıklı işlerde ise GVL nedeniyle daha az yardımcı olurlar (bunu bir sonraki bölümde ele alacağız).
- Uygun: birçok URL'yi indirmek, birçok dosyayı okumak.
- Sınırlı: çekirdekler arasında heavy sayısal hesaplama.
Paylaşılan değişebilir durumu her zaman bir Mutex ile koruyun.
Hızlı Kontrol
İş parçacıkları hakkındaki anlayışınızı ölçün.
Özet: İş Parçacıkları
Ruby iş parçacıklarının temellerini öğrendiniz:
Thread.neweşzamanlı yürütmeyi başlatır.joinbekler;valuehem bekler hem de bir sonuç döndürür.- İş parçacıkları belleği paylaşır ve bu da yarış durumlarına yol açar.
synchronizekullanan birMutex, paylaşılan durumu korur.- İş parçacıkları G/Ç ağırlıklı işlerde çok etkilidir.
Sırada, iş parçacıklarının birden çok CPU çekirdeğini neden tam olarak kullanamadığını, yani GVL'yi inceleyeceğiz.
Sıkça Sorulan Sorular
“İş Parçacıkları” dersi ücretsiz mi?
Evet — “İş Parçacıkları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Ruby Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Ruby Academy kursu toplamda 4 dersten oluşur.
“İş Parçacıkları” dersinde ne öğreneceğim?
Eşzamanlı yürütme Ruby Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Ruby Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Ruby Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“İş Parçacıkları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Ruby Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Ruby Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İş Parçacıkları
- GVL Açıklaması
- Fiber'lar
- Ractor'lar