Ruby ile Thread Ä°ÅŸlemleri

Merhabalar,

Şu zamana kadar yazdığım yazılarda Ruby ile ilgili pek çok konuya değindik, bu konular arasında POP3 ve SMTP, HTTP ve FTP, Dosya İşlemleri, Çalışma zamanı, Module yapısı, Hata yakalama, Resim işlemleri, ODBC veri tabanı bağlantısı, Ruby nesnelerinin karşılaştırılması gibi konular mevcut. Aslında tüm bu yazılardan küçük bir kitap bile çıkabilirdi ama elbetteki yazım dilinin tekrar bir elden geçirilmesi gerekli. Her neyse, şu zamana kadar yazdığım yazılar umarım sizlerin de işine yaramıştır :). Benim yaradı valla, ben Ruby ile ilgili bazı konularda kendi bloğuma bakıyorum :).

Sözü uzatmadan baÅŸlıktan da anlaşılacağı gibi yazımızın konusuna yani Thread’lere(Türkçe’sini tam kestiremedim, hoÅŸgörün lütfen) geçelim. Åžimdi eÄŸer bir yazılımcıysanız, daha önceden Multi-Thread uygulamalar ile uÄŸraÅŸmıssanız, kolay bir konu olmadığını bilirsiniz. Gerçekten özellikle zor zamanlarda çok uyuz bir konu olabilir. Tüm bunlardan öte, yapımı ve tasarlanması çok pahalıya patladığı için, yazılımcılar tarafından pek tercih de edilmez. Ama iÅŸler Ruby’de biraz daha farklı, çünkü Ruby’de bu iÅŸlemler oldukça basit ve etkileyici :).

Çok kısa ve hoÅŸ bir örnek ile Ruby’nin bu konu ile ilgili birçok özelliÄŸini açıklamaya çalışayım..

$stdout.sync = true

puts "Başlangıç zamanı : #{Time.now}" # Başlangıç zamanı
# Herhangi exception'da tüm Thread'leri durdur.
Thread.abort_on_exception = true
allLogThread = [] # Tüm Thread'lerin saklandığı dizi.
4.times do |index| # Toplamda 2 * 3 = 6sn'lik iÅŸlem.
	# index değişkeni bu şekilde parametre geçilerek, thread-safe halini alır.
	logThread = Thread.new(index) do |number|
		sleep(number) # number sn.'lik işlem olduğunu düşünelim
		print "Logging...#{number}\n"
	end
	allLogThread << logThread
end

sleep(2) # 2 sn. lik işlem olduğunu düşünelim
print "Asıl işlem\n"

# Tüm Thread'lerin bitmesi bekleniyor.
allLogThread.each { |thread| thread.join }
puts "Bitiş zamanı : #{Time.now}"

Yukarıda yer alan iÅŸlemlerin aslında 8 sn.’de bitmesi gerekirken (sleep(0) + sleep(1) + sleep(2) + sleep(3) + sleep(2) = 8 sn.) tüm iÅŸlemler 3 sn. içerisinde biter. Kullanması iÅŸte bu kadar basit ve güvenlidir.

Artık elinizde en az iki adet ve birbirinden bağımsız iÅŸ var ise, hiç düşünmeden Ruby’nin basit fakat çok kullanışlı olan Multi-Thread teknolojisi ile programınızın performansını yükseltebilirsiniz.

Kolay gelsin.. :)