Eşzamansız programlama, başka bir programlama numarasından çok bir felsefedir. Son sorunuz temel olarak programlama yönleriyle ilgili cevapları alırken, cevabım çoğunlukla teorik olmak için bağlantısız bir yalnızlık olsa da, size aynı satırda değil, sadece referanslardan ziyade açıklamalarda yeni bir perspektif kurmaya çalışıyorum.
Bu, Asenkron Programlamanın neden ve nasıl yapıldığına dair temel bilgilerle ilgilidir.
Diyelim ki bir pastaneye gidersiniz (ve siparişin ardından pastanın hazırlanacağını varsayarız) - iki seçeneğiniz vardır, ya pasta hazır olana kadar beklemeyi tercih edersiniz ya da emri verirsiniz ve eve dönersiniz ve alırsınız sonra hazır olduğunda. İlki (bekle), zaman uyumlu bir yöntemdir ve daha sonra zaman uyumsuz bir yöntemdir . Söylemeye gerek yok, bu örnekte senkronize yerine neden asenkronize yöntemler kullanmalısınız?
Olay temelli programlama, asenkron sistemlerin kurulmasının yollarından sadece biridir ve sadece kullanışlı bir tasarım deseni değil, mimari bir kalıptır. Bu teorinin pratikte faydalı bir şekilde kullanıldığı durumları sıralıyorum - biraz netlik getireceğini umarak
Asenkron sistemlerin ilk örneklerinden biri Unix sistemi IO'dur. Bildiğimiz iken read()
, write()
ve hatta select()
çağırır bloklarını program akışını, ancak işletim sistemi içinde, onlar asenkron vardır yani çekirdek genellikle böyle bir zaman CPU özgür olana kadar blok aygıtı (aka sabit disk), dolgu tamponu biraz zaman alacağını bilir İlgili ipliğe göre ve dolayısıyla iplik (hazır değil) şeklinde park edilmiştir. Bakınız 1. Moris Bach "Unix İşletim sisteminin tasarımı"
Diğer bir yaygın örnek UI çerçevelerinin çoğunluğudur. Burada, tüm kullanıcı tıklamaları önce ilgili çağrıyı geri çağıran bir denetleyici üzerinden gönderilir . Önemli olan, bu tür geri aramaların, sistemin donacağı başka geri aramaları bekletmemesi gerektiğidir. UI denetleyicisinden arka uçlara yapılan çağrı, ağır işlemeler içeriyorsa genellikle eşzamansızdır.
Eşzamansız programlamanın bir başka güzel örneği (saf tasarım deseni olarak) Aktif Nesnedir. Bir aktif nesne, bir çok kuyruğunda birçok istek tutabilecek ve tek tek yürütebilecek şekilde kendi özel iş parçacığına sahip olandır. Bu Makaleye bakınız: Aktif Nesne . Bu kalıp, doğrudan Kurumsal yazılımdan mobil çerçevelere kadar kullanılır. Popüler platformlar Java / EJB ve .NET , normalde normal nesnelerin aktif nesneler olmasına izin veren Yerel veya Uzak eşzamansız yöntem çağrısı sağlar. Symbian'da aktif nesneler vardı: Sapobian OS'de Aapo Haapanen tarafından aktif nesneler (ayrıca bakınız: Symbian'da Aktif Nesneler ). Bu şimdi de mevcutAndroid ).
Active nesneden ayrı olarak, aynı yazar Douglas C. Schmidt , Active nesneye başka paralel olan ve aynı zamanda eşzamansız kalıp olan başka birçok eser üretti. Bu Olay İşleme Modellerini görün ve kitabının tamamı Desen Yönelimli Yazılım Mimarisi: Eşzamanlı ve Ağa Bağlı Nesneler için Desenler - V2 adlı kitabında bulunabilir.
Belirli bir nesne ihtiyaçları, API ne zaman döndürülür ise aslında işi başarmak için arka planda çalışan, her zamanki metodoloji bunu başarmak için çok dişli sistemine sahip olmaktır. Dişli sistemler, C (posix), C ++ ( artırma ) 'dan Java, C # ve benzerlerine kadar her yerde bulunur. Aktif Nesne aslında sadece bunu gizleyebilecek bir soyutlamadır. Aktif nesne uygulamalarının neden çıplak dişliler üzerinde tercih edildiğini görün Başka iyi bir okuma .
Ancak bu kavram, bir uygulamanın içindeki iş parçacıklarının veya nesnelerin ötesine geçerek zaman uyumsuz hale gelir. En iyi kullanımlardan biri, iki uygulamanın koordinasyon için birbirini beklemesi gerekmediği Dağıtılmış sistemlerdir. Eski, (ya da çok iyi değil, hangisine bakarsanız bakın) RPC senkronize edildi. [elbette, diğer eşzamansız RPC'ler de var]. Ancak Message Oriented Middleware gibi modern alternatifler , iyi nedenlerle gerçekten eşzamansız.
Sonuncusu ama en ilginç olanı, Asenkron iletişim modelinden faydalanabilecek Ajanlar programlamasıdır .
Eşzamansız programlama seksi görünmekle birlikte, aşağıdakileri içeren kendi karmaşıklığını yaratır:
- getiri değeri iletme çerçevesi
- iletişim ek yükü
- yapıları senkronize etmek için ek ihtiyaç
- Doğru yapılmaması durumunda kilitlenme, yarış vb. olasılığı.
... ve bunun gibi.
Her zaman sadece gerçek nedenlerle kullanılmalıdır.
Peki Asenkron model ne zaman kullanılmalıdır? Ne zaman bir arka plan iş parçacığı koymak ve arayanın eşzamansız gitmesine izin vermelisiniz?
Sistem kesin ciddi kaynak sohbeti uygulamak istediğinde: örneğin, mutlak sabit sayıda iş parçacığı tutmak istiyorsunuz. Eşzamansız kalıp, sistemi kuyruk uygulamaya zorlar.
Arayan kişinin " yapılması gereken diğer faydalı şeyler" yapması gerektiğinde gerçekten de orijinaldir. Pek çok kez, diğer ip blokajı kaldırılsa bile, faydalı bir şey yapmaz ve sonuçlar için oylamayı kapatır. Bu gerçekten temel senkron modelden daha fazla CPU tüketen olabilir.
Dağıtık sistemlerde daha yüksek güvenilirlik seviyelerine ihtiyacınız olduğunda. (bkz. Mesaj Odaklı Middleware ).