Yapay zekadan makale özeti
- Kısa
- Ayrıntılı
- Bu video, bir eğitmen tarafından sunulan Python'da thread kavramını anlatan kapsamlı bir eğitim içeriğidir.
- Video, thread kavramının temel tanımıyla başlayıp, thread ve süreç arasındaki farkları açıklamaktadır. Ardından Python'da thread modülünün kullanımı, "start_new_thread" fonksiyonu, threading modülünün temel özellikleri ve "Thread" sınıfının kullanımı adım adım gösterilmektedir. Son bölümde ise thread synchronization kavramı, race condition problemi ve bunun çözümü için lock mekanizması detaylı olarak anlatılmaktadır.
- Eğitim boyunca her konu için örnek kodlar yazarak, threadlerin nasıl oluşturulacağı, yönetileceği ve senkronize edileceği adım adım gösterilmektedir. Ayrıca, threading modülünden "thread" sınıfını subclass ederek kendi thread sınıfını oluşturma ve bu sınıf üzerinden thread yönetimi de anlatılmaktadır.
- 00:01Thread Nedir?
- Bir thread, bir süreç içindeki bireysel ve ayrı bir yürütme birimidir.
- Bir süreç, çalışan bir programdır; örneğin bir tarayıcı veya video oyunu.
- Bir süreç içinde birden fazla thread çalışabilir ve program paralel olarak çalışabilir.
- 00:47Threadlerin Önemi
- Video oyunları gibi uygulamalar, grafik, kullanıcı arayüzü ve ağ gibi farklı görevleri paralel olarak işlemek zorundadır.
- Threadler sayesinde uygulamalar her zaman yanıt verebilir ve görevleri paralel olarak çalıştırabilir.
- Bir süreç içinde birden fazla thread bulunabilir ve her thread kendi kod ve yerel değişkenlerine sahiptir.
- 02:15Thread ve Süreç Arasındaki Farklar
- Bir thread, bir süreç içindeki bir kontrol akışıdır.
- Bir thread, süreç içinde tamamen bulunur ve kaynakları paylaşır.
- Her thread, global değişkenleri paylaşabilir ve kendi yerel değişkenlerine sahip olabilir.
- 03:48Thread Türleri
- İki farklı tür thread vardır: çekirdek thread ve kullanıcı alanı thread.
- Çekirdek threadler işletim sisteminin bir parçasıdır, kullanıcı alanı threadler ise işletim sisteminde uygulanmamıştır.
- Her süreç en az bir ana thread içerir.
- 04:34Thread Kullanımının Avantajları
- Çoklu çekirdekli bilgisayar sistemlerinde, çoklu threadli programlar daha hızlı çalışabilir.
- Programlar her zaman yanıt verebilir, bu hem tek çekirdekli hem de çoklu çekirdekli sistemlerde geçerlidir.
- Bir thread beklerken, program başka bir şey yapabilir ve program her zaman yanıt verebilir.
- Bazı programlar, paralellik kullanılarak daha kolay ifade edilebilir, bu da daha kolay bakım ve hata ayıklama sağlar.
- Birden fazla thread, global değişkenleri paylaşabilir, bu da bir değişkenin değiştirilmesinin tüm threadlerde etkili olmasını sağlar.
- 06:14Thread Kullanımında Karşılaşılan Zorluklar
- Bir program, threadleri hızlı ve etkili bir şekilde değiştirebilmelidir.
- Birden fazla thread, aynı bellek alanını paylaşabilir, bu nedenle bir threadte yapılan işlemler diğer threadlerde sorunlara yol açabilir.
- Threadler genellikle koordinasyon gerektirir ve "yarış koşulları" adı verilen durumlar oluşabilir.
- Genellikle senkronizasyon için kilitleme ilkelleri kullanılır.
- 07:35Python'da Threadler
- Python'da bir thread, veri tutabilen, yöntemlerle çalıştırılabilen ve veri yapılarında saklanabilen bir nesnedir.
- Python'da iki thread modülü vardır: thread modülü ve threading modülü.
- Thread modülü uzun süredir kullanılmamaktadır ve kullanıcılar threading modülünü tercih etmelidir.
- Python 3'te thread modülü doğrudan kullanılamaz, ancak "__thread__" kullanılarak kullanılabilir.
- Thread modülü, threadleri fonksiyon olarak görürken, threading modülü threadleri nesne yönelimli bir şekilde işler.
- 09:16Python 3'te Thread Modülü Kullanımı
- Python 3'te thread modülü doğrudan kullanılamaz, ancak "__thread__" kullanılarak kullanılabilir.
- Thread modülünü kullanmak için "import __thread__" komutu kullanılmalıdır.
- Thread modülünü kullanarak fonksiyonları ayrı threadlerde çalıştırabilirsiniz.
- Bir thread için iki argüman gerekir: threadin adı ve gecikme süresi.
- Thread modülünde "start_new_thread" fonksiyonu, belirtilen fonksiyonu ayrı bir threadde çalıştırır.
- 14:45Python'da Thread Kullanımı
- Python'da thread oluşturmak için "start_new_thread" fonksiyonu kullanılır ve bu fonksiyona fonksiyon adı, argüman sayısı ve isteğe bağlı olarak keyword argümanları verilir.
- Fonksiyon adı verilirken parenthesis kullanılmamalıdır ve argüman sayısı tuple şeklinde belirtilir.
- Threadlerin hızlı çalışması nedeniyle, threadlerin daha iyi görülebilmesi için delay (bekleme) süresi eklenebilir.
- 16:28Threadlerin Çalıştırılması
- Birden fazla thread oluşturmak için "start_new_thread" fonksiyonunu tekrar tekrar kullanmak gerekir.
- Threadlerin oluşturulması için bekleme mekanizması gereklidir, bu bekleme için "input" fonksiyonu veya "while 1: pass" gibi sonsuz döngü kullanılabilir.
- Threadlerin çalışma sırası, verilen delay değerlerine göre belirlenir ve her thread belirli bir sayıda kez çalıştırılabilir.
- 19:58Threadlerde Hata Yönetimi
- Thread içindeki fonksiyon başarıyla çalışırsa, thread sessizce kapanır.
- Fonksiyon beklenmedik bir şekilde sona ererse, unhandled exception (işlenmemiş hata) oluşur ve stack trace terminalde görüntülenir.
- Hata yönetimi için "try-catch" bloğu kullanılabilir, böylece hata oluştuğunda belirli bir işlem yapılabilir.
- 21:53Threading Modülü Kullanımı
- Threading modülü, Python'da thread oluşturmak için daha güçlü ve yüksek seviye destek sunar.
- Threading modülünü kullanmak için önce "import threading" ve "import time" komutları ile modüller import edilmelidir.
- Threading modülünde "Thread" sınıfı kullanılarak threadler oluşturulur ve "start" metodu ile çalıştırılır.
- 26:47Python'da Threading Modülü Kullanımı
- Threading modülünde "join" yöntemi kullanılarak bir threadin diğer threadin tamamlanmasını beklemesi sağlanabilir.
- Thread oluşturmak için "Thread" sınıfından örnek alınır ve constructor'a "target" (çağrılacak fonksiyon) ve "args" (fonksiyona verilecek parametreler) argümanları verilir.
- "start" yöntemi threadi başlatırken, "join" yöntemi diğer threadin tamamlanmasını bekler.
- 29:28Farklı Fonksiyonları Birden Fazla Thread ile Çağırma
- Birden fazla fonksiyonu farklı threadlerle çağırmak için her fonksiyon için ayrı thread oluşturulabilir.
- Fonksiyonlara parametre verirken, tek parametreli fonksiyonlara değer ve virgül ile tuple olarak birden fazla parametre verilebilir.
- Farklı fonksiyonlar farklı aralıklarla çalıştırılabilir, bu da farklı zaman aralıklarında çıktıların görüntülenmesini sağlar.
- 32:52Subclass Oluşturarak Thread Oluşturma
- Threading modülünden "Thread" sınıfından subclass oluşturarak özel threadler oluşturulabilir.
- Subclass'ta "init" metodu tanımlanarak threadin adı ve gecikme süresi gibi parametreler alınabilir.
- "run" metodu override edilerek threadin giriş noktası olarak ayarlanabilir ve bu metodda threadin adı ve gecikme süresi gibi bilgiler ekrana yazdırılabilir.
- 37:15Subclass Oluşturulmuş Threadlerin Çalıştırılması
- Subclass'tan oluşturulan threadlerin örnekleri oluşturulabilir ve "start" metodu ile çalıştırılabilir.
- "join" metodu kullanılarak bir threadin diğer threadin tamamlanmasını bekleyebilir.
- Her threadin adı ve gecikme süresi gibi bilgiler ekrana yazdırılabilir.
- 40:06Python'da Thread Sınıfından Subclass Oluşturma
- Python'da thread sınıfından subclass oluşturarak birden fazla thread çalıştırılabilir.
- Thread sınıfından türetilen sınıflar, threading modülünde bulunan özel yöntemleri kullanabilir.
- Threading modülünde aktif thread sayısını, mevcut threadleri ve thread isimlerini öğrenmek için çeşitli yöntemler bulunmaktadır.
- 40:48Threading Modülündeki Özel Yöntemler
- Threading modülünde "threading.active_count()" yöntemi, programdaki aktif thread sayısını döndürür.
- "threading.current_thread()" yöntemi, şu anda aktif olan threadi gösterir.
- "threading.enumerate()" yöntemi, programdaki tüm aktif threadleri listeler.
- 43:10Thread İsimlerini Görüntüleme
- Subclass oluşturulan thread sınıflarında "get_name()" yöntemi kullanılabilir.
- "get_name()" yöntemi, threadin varsayılan olarak "Thread1" veya "Thread2" olarak atanan ismini döndürür.
- Subclass içinde "name" özelliği değiştirildiğinde, "get_name()" yöntemi bu yeni ismi döndürür.
- 45:01Thread Synchronization ve Race Condition
- Thread synchronization, paralel çalışan threadlerin aynı kaynakları aynı anda kullanmaması için gerekli mekanizmadır.
- Race condition, iki veya daha fazla threadin aynı paylaşılan veriyi aynı anda değiştirmeye çalışması durumudur.
- Race condition olduğunda, değişkenlerin değeri belirsiz olabilir çünkü hangi threadin önce çalıştığı bilinmemektedir.
- 47:06Thread Synchronization Örneği
- Örnek kodda, iki thread aynı global değişkeni (x) aynı anda değiştirmeye çalışıyor.
- İlk başta, thread sayısı 10 olduğunda sonuç 20 olarak doğru çıkıyor.
- Thread sayısı 100.000 olduğunda, thread synchronization problemi ortaya çıkıyor ve sonuç belirsiz hale geliyor.
- 51:24Thread Synchronization Çözümü
- Thread synchronization problemini çözmek için "locks" kullanılabilir.
- "locks" sınıfı, "acquire()" ve "release()" adlı iki yöntem içerir.
- "acquire()" yöntemi, paylaşılan veriyi kilitlemek için kullanılır ve varsayılan olarak bloklayıcıdır.
- 53:57Thread Synchronization ve Lock Kullanımı
- Bir değişkene sadece bir thread aynı anda erişebilir, diğer threadler bu değişkene erişmek için önce lock'u almalıdır.
- Bir thread değişkene erişim için lock'u alır, işlemi tamamladıktan sonra lock'u serbest bırakır ve böylece diğer threadler de aynı değişkene erişebilir.
- Bu mekanizma, paylaşılan bir kaynakta sadece bir threadin aynı anda çalışmasını sağlayarak thread senkronizasyon sorunlarını önler.
- 55:05Program Örneği ve Sorun Çözümü
- Programda thread senkronizasyon sorunu yaşanıyor ve bu sorunun nedeni arg'ların tuple olarak geçilmemesidir.
- Arg'ları tuple olarak geçmek için "args" anahtar kelimesini kullanırken her arg'ı ayrı ayrı tuple içinde belirtmek gerekir.
- Program tekrar çalıştırıldığında, iki threadin aynı değişkene 100.000 kez erişim sağladığı için beklenen sonuç 200.000 olarak elde edilir.