Threading İşlemleri (Parallel Threading, Mutex, Üst Düzey Ruby #7)

Bunjo

Uzman üye
14 Ara 2020
1,591
1,891
I Won
Merhaba ben BUNJO, Threading konusu daha fazla ayrıntı isteyen bir konudur ben bu konuda
sadece "
Parallel Threading" ve "Mutex" kavramlarını anlatacağım,
daha sonra "sync" ve "async" gibi kavramları anlatırım.


"try-catch": Üst Düzey Ruby Eğitimi #6 (try-catch)
"multidimensional-arrays": Üst Düzey Ruby Eğitimi #6 (multidimensional)
"net/http": Üst Düzey Ruby Eğitimi #5 (net/http)
"tk": Üst Düzey Ruby Eğitimi #4 (Görsel Programlama)
"regexp": Üst Düzey Ruby Eğitimi #3 (Regexp, Fonksiyonlar)
"functions": Üst Düzey Ruby Eğitimi #3 (Regexp, Fonksiyonlar)
"symbols": Üst Düzey Ruby Eğitimi #2 (Semboller, Struct)
"structs": Üst Düzey Ruby Eğitimi #2 (Semboller, Struct)
"variables":
Üst Düzey Ruby Eğitimi #1 (Değişkenler, Puts)


- Threading Nedir?-

Threading, programlamada aynı anda birden fazla görevin yürütülmesine olanak tanıyan bir konsepttir. Bir işlem içindeki thread'ler, işlemci kaynaklarını daha etkili bir şekilde kullanarak paralel çalışabilirler. Bu, özellikle çoklu çekirdekli işlemcilere sahip modern bilgisayar sistemlerinde performans artışı sağlamak için önemlidir.




- Python İle Thread Oluşturmak -

Kısaca "Python" ile bahsedeyim fakat bu konu Ruby ağırlıklı.

Python:
import threading
import time

def print_numbers():
    for i in range(5):
        time.sleep(1)
        print(f"Thread 1: {i}")

def print_letters():
    for letter in 'ABCDE':
        time.sleep(1)
        print(f"Thread 2: {letter}")

# Thread objelerini oluştur
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# Thread'leri başlat
thread1.start()
thread2.start()

# Ana programın beklemesi için thread'lerin tamamlanması
thread1.join()
thread2.join()

print("Program sona erdi.")

- Ruby İle Threading -
Ruby ile "Thread" oluşturmak gayet basittir fakat genelde kullanılan Mar'z Ruby Interpreter'de bulundan "GIL" bize sorun çıkartır.

- "GIL" Nedir? -

Konuya Gitmek İçin Tıkla



- new -

Thread oluşturmak için kullanılır.
Ruby:
# Thread ile basit örnek
thread1 = Thread.new do
  5.times do |i|
    sleep(1)
    puts "Thread 1: #{i}"
  end
end

thread2 = Thread.new do
  ('A'..'E').each do |letter|
    sleep(1)
    puts "Thread 2: #{letter}"
  end
end

# Thread'leri beklet
thread1.join
thread2.join

puts "Program sona erdi."

- mutex -
Threadin güvenli çalışmasını sağlamak için kullanabilirsiniz.
Ruby:
mutex = Mutex.new

counter = 0

thread1 = Thread.new do
  5.times do
    mutex.synchronize do
      counter += 1
      sleep(1)
      puts "Thread 1: #{counter}"
    end
  end
end

thread2 = Thread.new do
  5.times do
    mutex.synchronize do
      counter += 1
      sleep(1)
      puts "Thread 2: #{counter}"
    end
  end
end

# Thread'leri beklet
thread1.join
thread2.join

puts "Program sona erdi."

- abort_on_exception -

Tanımlanan thread herhangi bir hata koşulunda iptal edilir.
Ruby:
Thread.abort_on_exception = true
t1 = Thread.new do
  puts  "İkinci thread"
  raise "Hata algılandı"
end
t1.join
print "tamamlandı."

- critical -

Thread çalışırken kritik bir durumda true olarak tanımlayabilirsiniz, true olarak tanımlandığında yeni thread oluşturulmasını engeller.
Ruby:
count=0
Thread.new { while true; sleep(1); print "Merhaba"; count+=1; end }
while count < 3 do end
Thread.critical = true
puts "Kritik olay aldılandı."

- current -

İşlemi yapan threadin hangi thread olduğunu anlamak için kullanabilirsiniz.
Ruby:
Thread.current    »    #<Thread:0x401be5c8 run>
- exit -

Çalışan bir threadi kapatmak için kullanabilirsiniz.

Kod:
Thread.exit # Threadi kapatır
- join -


Oluşturulan thread parçacıklarının tamamlanmasını beklemek.
Ruby:
# İki Thread Oluşturalım
thread1 = Thread.new { puts "Thread 1 çalışıyor..." }
thread2 = Thread.new { puts "Thread 2 çalışıyor..." }

thread1.join
thread2.join

puts "Tamamlanmasını beklemek."

gibi gibi devam eder burada hepsini anlatamam
dökümantasyon için: Ruby-Doc.org: Documenting the Ruby Language


- Ruby İle Parallel Threading -

Ruby dili Windows'da paralel programlama konusunda iyi bir destek sunmaz, fakat "Linux" gibi platformlarda kullanabileceğiniz "concurrent-ruby" gibi kütüphaneler ile paralel programlama yapabilirsiniz ayrıca JRuby İmplementasyonu bu konuda bahsettiğim impelementasyonuda kullanabilirsiniz, bunun için internetten aldığım bu kodu burada paylaşayım.

Ruby:
require 'concurrent'

# Function that simulates some time-consuming task
def perform_task(thread_name)
  3.times do |i|
    puts "#{thread_name} is performing task #{i}"
    sleep(rand(1..3)) # Simulate some work
  end
  "#{thread_name} has completed its tasks"
end

# Create two futures (representing threads)
future1 = Concurrent::Future.execute { perform_task("Thread 1") }
future2 = Concurrent::Future.execute { perform_task("Thread 2") }

# Wait for both futures to complete and retrieve the results
result1 = future1.value
result2 = future2.value

# Output the results
puts result1
puts result2
puts "Both threads have completed"

Windows ve Linux için Ruby dilinde paralel programlama örneği (gerçek bir paralel programlamaya aynı düzeyde çalışamaz.
JRuby impelementasyonu kullanarak yapabilirsiniz bunun için daha sonra bir konu açacağım.)



Ruby:
def perform_task(thread_name)

  3.times do |i|

    puts "#{thread_name} Çalışan thread #{i}"

    sleep(rand(1..3))

  end

  "#{thread_name} tamamladı"

end

num_threads = 3
threads = []

num_threads.times do |i|
  threads << Thread.new { puts perform_task("Thread #{i}") }
end

threads.each(&:join)

puts "tüm parçacıklar tamamlandı."

Bu konuda değineceğim kavramlar bu kadardı.
Okuduğunuz için teşekkür ederim.
 

Çokgen

Katılımcı Üye
4 Eyl 2023
412
194
Ellerine sağlık Bunjo Hocam. Yine harika bir konu. (Dos ve yeni exploit konusu bekliyorum : D )
 

Bunjo

Uzman üye
14 Ara 2020
1,591
1,891
I Won
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.