Rust - Eşzamanlılık
Eşzamanlı programlamada, bir programın farklı bölümleri bağımsız olarak çalışır. Öte yandan paralel programlamada, bir programın farklı bölümleri aynı anda çalışır. Her iki model de aynı derecede önemlidir çünkü daha fazla bilgisayar birden çok işlemciden yararlanır.
İş Parçacığı
Kodları eşzamanlı olarak çalıştırmak için konuları kullanabiliriz. Mevcut işletim sistemlerinde, çalıştırılan bir programın kodu bir işlemde çalıştırılır ve işletim sistemi birden çok işlemi aynı anda yönetir. Programınızda aynı anda çalışan bağımsız bölümlere de sahip olabilirsiniz. Bu bağımsız parçaları çalıştıran özelliklere iş parçacığı denir.
Konu Oluşturma
thread::spawnişlevi yeni bir iş parçacığı oluşturmak için kullanılır. Spawn işlevi parametre olarak bir kapanış alır. Kapanış, iş parçacığı tarafından yürütülmesi gereken kodu tanımlar. Aşağıdaki örnek, bir ana konu grubundaki bazı metinleri ve yeni bir konu grubundaki diğer metni yazdırır.
//import the necessary modules
use std::thread;
use std::time::Duration;
fn main() {
//create a new thread
thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
//code executed by the main thread
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
}
Çıktı
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the spawned thread!
hi number 4 from the main thread!
Ana iş parçacığı 1'den 4'e kadar değerleri yazdırır.
NOTE- Yeni iplik, ana iplik bittiğinde durdurulacaktır. Bu programın çıktısı her seferinde biraz farklı olabilir.
thread::sleepişlev, bir iş parçacığını kısa bir süre için çalışmasını durdurmaya zorlar ve farklı bir iş parçacığının çalışmasına izin verir. İş parçacığı büyük olasılıkla sırayla gelecektir, ancak bu garanti edilmez - bu, işletim sisteminin iş parçacıklarını nasıl programladığına bağlıdır. Bu çalışmada, ortaya çıkan iş parçacığından gelen print ifadesi kodda ilk olarak görünse bile, ilk olarak ana iş parçacığı yazdırılır. Dahası, ortaya çıkan iş parçacığı 9'a kadar değerleri yazdıracak şekilde programlanmış olsa bile, ana iş parçacığı kapanmadan önce yalnızca 5'e ulaştı.
Kolları Birleştir
Ortaya çıkan bir iş parçacığının tamamen koşma veya koşma şansı olmayabilir. Bunun nedeni, ana iş parçacığının hızla tamamlanmasıdır. Fonksiyon yumurtlama <K, T> (f F) -> JoinHandlelt T> bir JoinHandle döndürür. Birleştirme () JoinHandle ilgili yöntem bitirmek için ilgili iplik için bekler.
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
});
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
handle.join().unwrap();
}
Çıktı
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the spawned thread!
hi number 2 from the main thread!
hi number 3 from the spawned thread!
hi number 3 from the main thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!
Ana iş parçacığı ve oluşan iş parçacığı değişmeye devam eder.
NOTE - Ana iş parçacığı, ortaya çıkan iş parçacığının çağrısı nedeniyle tamamlanmasını bekler. join() yöntem.