Asysnc/Awake
Last updated
Last updated
Windows da senkron çalışma, thread lerin kernelden sonuç beklemesi ve boşa RAM harcamasına sebep olur. Bloklama işlemi ilgili hardware donanımında yapılır. İşletim sistemi bir şey yapmıyor. Thread sadece bekliyor. Gelen cevap Windows üzerinden thread bilgi verir. Yeni istekler için yeni thread açacak bir yapı kurulması gerekir.
IRP: Input/Output Request Packet
Thread in gelen cevabı beklemesi yerine git başka işler yap diyebilirsiniz. Yani işlerinizi asenkron olarak halledebilirsiniz.
Örneğin, ReadAsync() diyince otomatik olarak bir task objesi oluşturuluyor ve iş ile alakalı bilgiler içerisine yerleştiriliyor. Windows senkrondaki gibi gerekli IRP isteğini ilgili donanıma gönderiyor. Ancak thread iniz thread poll geri dönüyor.
Peki yanıt oluştuğunda nasıl kaldığımız yerden devam ediyoruz?
Burada bazı protokoller var. Bazı portlar açılıyor. Windows bu portları kullanarak işin kimden geldiğini iş bittikten sonra kimin haberdar edileceğini biliyor. Yani uygulamanızı yeniden çağırabiliyor. Thread poll' a tekrar iş konuyor ve çalışması için bekliyor olacaktır. Extra thread oluşturmadan işlerimizi halledebiliyoruz. Event mekanizması kullanarak async programlama yapmış oluyoruz.
Sonuç olarak thread iniz bloklanmıyor. Yeni thread oluşturmak zorunda kalmayabiliyorsunuz. Tabiki iş yoğunluğuna göre thread sayısı artabilir.
Javascript mantığı da bu şekildedir.
Goland de async yok. Onun yerine channel (concurrency)var. Goland de go rutinleri var. Alt yapılarında thread kullanılıyor. Ancak go rutinleri co-operative yani işi bittikten sonra kullandığı threadi bırakıyor. Bunun artı eksi yönleri var. İşler çok uzun sürmeye başlarsa thread çok fazla kullanılır ve diğer işlere zaman kalmaz. Bunun için timeout yapıları kurmuşlar. CPU üzeinde threadler time sharring yaparken golang de go rutinleri time sharing yapar.
Go rutinlerinin bir artısı da düşük kaynak tüketimiyle başlarlar gerektikçe kaynak alırlar. Bu da çok hızlı bir şekilde çok fazla sayıda oluşturulabilmeleri sağlanır.