Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 6958|Yanıt: 1

Çok çalışma parçacıklılığı ölçeklenebilirliği çıkmaz bir sona sokar

[Bağlantıyı kopyala]
Yayınlandı 6.12.2014 22:21:58 | | |
Bu Python dünyasından bir makale, ancak hâlâ tüm programlama alanına uygulanabilir; çoklu iş parçacığı talepleri daha hızlı işlememize olanak tanır, ancak bir tavan da var, yeşil (mikro iş parçacığı) iş parçacıkları çözümdür.

Çok iplikli yazılım geliştirme, özellikle kullanıcılara hızlı yanıt vermek için zorlu performans gerektiren ağ odaklı uygulamalar için çok sayıda sorunu çözer. Ne yazık ki, çoklu iş parçacığı büyük ölçekli sorunları çözmek için yeterli değildirEşzamanlı eşlikcinsel sorunlar.

Bu sorunların çözümü, asenkron olaylar ve geri çağırma tabanlı mekanizmalar kullanarak programlama modellerinin değiştirilmesini gerektirir. Druva'da, büyük ölçekli sorunları çözmek için Dhaga adlı bir python kütüphanesi oluşturdukEşzamanlı eşlik, oysa programlama modeli önemli değişiklikler gerektirmez.

Yazılım geliştiricileri bir yerde yaşıyorEşzamanlı eşlikdünya. Thread'ler bugün birinci sınıf vatandaşlar, özellikle geliştirme sırasında, özellikle uygulamanız yoğun ağ işlemleri yaparken, örneğin Druva gibi inSync sistemi (ağ güvenliği senkronizasyon ürünü) gibi. Çok iplikli işlem, ağ işlemleri için programlama kodunun akışını basit ve düzenli bir şekilde sağlar. Uygulamamızda performans iyileştirmeleri veya iyileştirmeler gerektiğinde, geliştirilebilirElastikiyet, iplik sayısını artırabiliriz.

Ama binlerce ölçek söz konusu olduğundaEşzamanlı eşlikİstikler, konular yeterli değil.

Çok iplikli yaklaşımın aşağıdaki dezavantajlarını bulduk:
1. inSync sistem istemcisi, ağ RPC çağrıları aracılığıyla sunucuya çok sayıda dosyayı yedeklemek zorundadır. Geliştiricilerin işleri hızlandırmasının tipik bir yolu iş parçacıkları kullanmaktır. Ancak, çoklu iş parçacığı ile sağlanan performans, bellek ve CPU maliyetini artırır; Geliştiricilerin hız ile iş parçacığı sayısı arasında denge kurması gerekiyor.

2. Sunucularımızın inSync sistemi ile binlerce müşteri arasında işlem yapması gerekiyorEşzamanlı eşlikBağlantılar ve bildirimler. Bağlantıları verimli bir şekilde yönetmek için istekler için iş parçaları kullanıyoruz. Ancak inSync sistem müşterilerinin artan sayısı, iş parçacığı sayısını artırmaya devam etmemiz gerektiği anlamına geliyor; bu da çok fazla sunucu belleği ve CPU tüketiyor.

3. Web sunucumuz binlerce paralel HTTP isteğini yönetmek zorunda. İşin çoğu, veri alan ve gönderen ve bunları inSync sisteminin arka uçuna ileten ağ soketleri üzerindedir. Çoğu iş parçacığı ağ işlemlerini bekletiyor. C10K sorununa neden olan şey, web sunucusuna binlerce eşzamanlı istek olduğunda, her istek için bir iş parçacığı oluşturmak oldukça ölçeklenebilir (Ölçekleme).

Asenkron çerçevelerin sınırlamaları
Twisted, Tornado Tornado ve asyncore gibi birçok asenkron framework, geliştiricilerin threads kullanmanın popüler yollarından uzaklaşmalarına yardımcı olabilir. Bu çerçeveler, engelleyici olmayan soketler ve geri çağırma mekanizmalarına (Node.js'ye benzer) dayanır. Bu çerçeveleri olduğu gibi kullanırsak, Druva kodumuzun ana kısımları yeniden düzenlenmek zorunda kalacak. Yapmak istediğimiz bu değil. Kodun yeniden yapılandırılması, geliştirme ve test döngülerini hızlandırıyor ve ölçek gereksinimlerimizi karşılamamızı engelliyor. Ürünün birden fazla parçasının büyük olması gerektiği için, her birimiz bunları yeniden yapılandırmak zorunda kalacağız – bu yüzden iki kat veya üçe katlama çabası gerekiyor.

Bu kadar çok kodu değiştirmemek için mevcut framework'ü doğrudan kullanmaktan uzaklaşmamız gerekiyordu. Neyse ki, bazı faydalı araçlar bulduk.

Ağ I/O'da kodun yürütülmesini kontrol etmek istediğimiz için, bir iş parçacığını mikro iş parçacıklarına bölmenin bir yoluna ihtiyacımız var. Buldukyeşil letler。 Bu program, co-routine coroutine adı verilen örtük olmayan bir mikrothread zamanlaması sağlar. Başka bir deyişle. Kodunuzu çalışırken kontrol etmek istediğinizde faydalıdır. Greenlet'lerin duraklamalar verdiği zaman kontrol edebildiğiniz için özel takvim için mikrothreadler oluşturabilirsiniz. Bu bizim için mükemmel çünkü kodumuzun zamanlama üzerinde tam kontrol sağlıyor.

Tornado, binlerce asenkron isteği yönetmek üzere tasarlanmış Python ile yazılmış, basit, engelleyici olmayan bir web sunucusu çerçevesidir. Temel bileşeni olan IOLoop IOStream kullanıyoruz. IOLoop, engelleyici olmayan bir soket G/Ç olay döngüsüdür; Linux'ta epoll veya BSD ve Mac OS X kuyrukları kullanır, yoksa Windows'ta varsa seçimler olur. IOStream, okuma ve yazma için pratik paketleme gibi engelleyici olmayan soketler sağlar. Tüm soket işlemlerini Tornado'ya devrediyoruz ve ardından kod işlemlerini başlatmak için geri çağrılar kullanıyoruz (banq not: Node.js mekanizmaya çok benziyor).

İyi bir başlangıç, ama daha fazlasına ihtiyacımız var. Yukarıdaki modülü doğrudan kodumuzda kullanırsak, RPC kodlarımızın çoğu değişmek zorunda kalacak; RPC'yi yeşil letler aracılığıyla planlamak, yeşil letlerin bloklanmamasını sağlamak (yeşil letler tıkanırsa, tüm iş parçacılığını ve diğerlerini tıkatır), tornado'dan geri çağrı fonksiyonlarını yönetmek.

Yeşil letleri harici çağrılarla tıkamamak için yönetecek ve düzenlemek için bir soyutlama gerekiyor ve bu soyutlama iş parçacıklarının ötesinde büyük ölçeklenebilir. Bu soyutlama Dhaga'dır; uygulama kod akışının geleneksel bir senkron dizi gibi programlanmasına olanak tanır, ancak yürütme asenkrondur.

Dhaga (Hintçe'den, yani thread) soyutladığımız hafif bir iş parçacığı için bir yürütme çerçevesidir. Dhaga sınıfı, yeşil yapraklardan türetilmiştir ve tek bir işletim sistemi iş parçacığında birden fazla kod akışını çalıştırmak için yığın anahtarlamasını kullanır. Bir işletim sisteminin iş parçacıkları, işbirlikçi zamanlama kullanarak birden fazla dhagase çalıştırır. Bir dhaga beklediğinde (çoğunlukla RPC çağrısının geri dönmesini beklerken), kontrolü ana seviyeye (yani onu oluşturan işletim sistemi seviyesindeki iş parçacığının yürütme bağlamına verir). Ebeveyn seviyesi daha sonra başka bir dhaga programı koşmaya hazır olarak planlar. RPC çağrısı, Socket'i asenkron olarak yazmak üzere tornado web sunucusuna iletilir ve geri döndüğünde geri çağrı kaydedilir; bu RPC geri döndüğünde, bekleyen dhaga çalıştırılabilir kuyruğuna eklenir ve ana iş parçacığı tarafından alınır. (Banq notu: node.js prensibe benzer)

Yüksek gecikmeli işlemler için iş parçacıkları yerine Dhaga kullanabiliriz ve iş parçacığı makul bir sınırın ötesine geçtiğinde tek bir iş parçacığında 512 dhaga kullanıyoruz.







Önceki:MVC çerçeve deseni ölü
Önümüzdeki:MVC çerçevelerinin avantajları ve dezavantajları:
Yayınlandı 7.12.2014 17:22:55 |
Okumak ve geri göndermek bir erdemdir
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com