Eşzamansız ve paralel programlama arasındaki fark nasıl ifade edilir?


139

Birçok platform, yanıt verme yeteneğini geliştirmek için eşzamansızlığı ve paralelliği teşvik eder. Farkı genel olarak anlıyorum, ancak kendi zihnimde ve başkaları için açıkça ifade etmekte zorlanıyorum.

Ben bir geçici programcıyım ve async ve geri çağrıları oldukça sık kullanıyorum. Paralellik egzotiktir.

Ancak özellikle dil tasarımı düzeyinde kolayca sınırlandırıldığını hissediyorum. İlişkilerinin (veya ilişkilerinin) ve her birinin en iyi uygulandığı program sınıflarının net bir açıklamasını isterim.


Eşzamansız ve paralel programlama arasındaki ilişki hakkında bir blog yazısı yazdım - anat-async.blogspot.com/2018/08/…
Alexei Kaigorodov


6
paralellik, olayların aynı anda gerçekleştiği zamandır. Asenkroniklik, bir eylemin sonucunun devam etmesini beklemek için uğraşmadığınız zamandır. Sadece uyuyorsun ve bir süre sonra sonuç geliyor, çanını çalıyor, uyanıyor ve oradan devam ediyorsun. Zaman uyumsuz yürütme, seri olarak yalnızca bir iş parçacığında mükemmel şekilde gerçekleşebilir. (Javascript'in yaptığı hemen hemen budur)
Thanasis Ioannidis

Yanıtlar:


87

Bir şeyi eşzamansız olarak çalıştırdığınızda, bunun engelleme olmadığı anlamına gelir, onu tamamlamasını ve başka şeylerle devam etmesini beklemeden yürütürsünüz. Paralellik, aynı anda birden çok şeyi paralel olarak çalıştırmak anlamına gelir. Paralellik, görevleri bağımsız iş parçalarına ayırabildiğinizde iyi çalışır.

Örneğin, 3B animasyonun oluşturma karelerini ele alalım. Animasyonu oluşturmak uzun zaman alır, bu yüzden bu render'i animasyon düzenleme yazılımınızdan başlatırsanız, eşzamansız olarak çalıştığından emin olursunuz, böylece kullanıcı arayüzünüzü kilitlemez ve başka şeyler yapmaya devam edebilirsiniz. Şimdi, bu animasyonun her karesi ayrı bir görev olarak da düşünülebilir. Birden fazla CPU / Çekirdek veya birden fazla makinemiz varsa, genel iş yükünü hızlandırmak için paralel olarak birden fazla çerçeve oluşturabiliriz .


Bakalım bunu anladım. Farklı kareleri oluşturmanın paralel görevleri birden fazla CPU / çekirdeğe yayılmalıdır. Bunun, görevin tamamlanma zamanlamasıyla ya da o görevin başka bir şeyi engelleyip engellemediği ile ilgisi yoktur. Bu sadece bir grup CPU'nun birlikte yapacağı ve sonucu bir süper hızlı CPU'da çalıştığı gibi sunacağı anlamına gelir. Sağ?

1
"Animasyonu oluşturmak uzun zaman alıyor, bu yüzden bu render'i animasyon düzenleme yazılımınızdan başlatacak olsanız, (...) 'dan emin olursunuz." Ne?

3D animasyon kısmı için: Her şeyden önce, ASLA CPU'da çerçeve üreten bir 3D grafik programı çalıştırmazsınız - aklı başında herhangi biri hemen GPU kullanmanızı önerir. İkincisi, bunu yaparsak (son derece cesareti kırılmış), kaç kare oluşturabileceğimizi ölçmek için bir zamanlayıcı kullanırdık, aksi takdirde bitmemiş bir render çağrısı Görevleri yığını oluşturabiliriz. Ancak, amacınız kullanıcı başına giriş etkinliği temelinde oluşturulan çoğu 2B oluşturma uygulamasında mükemmel bir şekilde geçerlidir.
ぐ イ き ん ぐ

1
Eşzamansız ve engellemeyen farklı paradigmalardır.
Lorne Marquis

73

Asıl ayrımın eşzamanlılık ve paralellik arasında olduğuna inanıyorum .

Zaman uyumsuzluk ve geri aramalar genellikle eşzamanlılığı ifade etmenin bir yoludur (araç veya mekanizma), yani birbirleriyle konuşan ve kaynakları paylaşan bir dizi varlık. Kaynakların paylaşılması isteğe bağlı iken zaman uyumsuzluk veya geri arama iletişimi örtük olması durumunda (sonuçların uzak bir makinede hesaplandığı RMI'yi düşünün). Doğru şekilde belirtildiği gibi, bu genellikle yanıt verme hızı göz önünde bulundurularak yapılır; uzun gecikme olaylarını beklememek .

Paralel programlama genellikle ana amaç olarak iş hacmine sahiptir, ancak gecikme, yani tek bir elemanın tamamlanma süresi, eşdeğer bir sıralı programdan daha kötü olabilir.

Eşzamanlılık ve paralellik arasındaki farkı daha iyi anlamak için , eşzamanlılık teorisi için iyi bir not kümesi olan Daniele Varacca'nın eşzamanlılığı için Olasılıkçı modellerden alıntı yapacağım :

Bir hesaplama modeli, muhtemelen birbirleriyle iletişim kuran bağımsız özerk bileşenlerden oluşan sistemleri temsil edebildiği zaman eşzamanlılık için bir modeldir. Eşzamanlılık kavramı, paralellik kavramıyla karıştırılmamalıdır. Paralel hesaplamalar genellikle işi çeşitli işlemciler arasında dağıtan merkezi bir kontrolü içerir. Eşzamanlı olarak, bileşenlerin bağımsızlığını ve birbirleriyle iletişim kurduklarını vurgularız. Paralellik, Firavun'un karar verdiği ve kölelerin çalıştığı eski Mısır gibidir. Eşzamanlılık, herkesin istediklerini yaptığı ve hepsinin cep telefonu kullandığı modern İtalya gibidir.

Sonuç olarak , paralel programlama, ayrı kuruluşların yüksek performans ve iş hacmi (genellikle) elde etmek için işbirliği yaptığı özel bir eşzamanlılık durumudur.

Async ve Callbacks, programcının eşzamanlılığı ifade etmesine izin veren bir mekanizmadır. Master / worker (işçi) / worker (işçi) / worker (işçi) / worker (işçi) / map (işçi) / map (map) / map / reduce (harita / azaltma) gibi iyi bilinen paralel programlama tasarım modellerinin, daha karmaşık merkezi etkileşimleri uygulamak için bu tür alt düzey mekanizmaları (zaman uyumsuz) kullanan çerçeveler tarafından uygulandığını düşünün .


37

Bu makale bunu çok iyi açıklıyor: http://urda.cc/blog/2010/10/04/asenkronize-versus-paralel-programlama

Eşzamansız programlama hakkında bu var:

Bir uygulamada "engellemeyi" önlemek için zaman uyumsuz çağrılar kullanılır. [Böyle bir] çağrı zaten var olan bir iş parçacığında (G / Ç iş parçacığı gibi) döner ve mümkün olduğunda görevini yerine getirir.

paralel programlama hakkında:

Paralel programlamada hala işi veya görevleri bölüyorsunuz, ancak önemli farklar, her iş parçası için yeni iş parçacıkları döndürmeniz.

ve özet olarak:

asenkron çağrılar kullanacağı sistem tarafından zaten kullanımda konuları ve paralel programlama gerektirir gerekli ayırma işlemleri, spinup ve söküm konuları kırmaya geliştirici .


3
Bu makale> buradaki tüm cevaplar (elbette bunun dışında!)
FellyTone84

1
Bağlantı için teşekkürler. Yani ... genel olarak, kullanıcı arayüzünden sunucuya (veya bir istemciden bir web hizmetine) iletişim kurarken zaman uyumsuz çağrıları kullanın. Sunucu veya web hizmeti ucunda ve ayrıca iş katmanınızda paralel iş parçacığı kullanın.
goku_da_master

18

Temel anlayışım:

Asynchonous programlama, başka bir şey yapmadan önce pahalı bir işlemin tamamlanmasını beklemek sorununu çözer. İşlemin tamamlanmasını beklerken başka şeyler yapabilirseniz, bu iyi bir şeydir. Örnek: bir web hizmetinden daha fazla veri alırken kullanıcı arayüzünü çalışır durumda tutma.

Paralel programlama ilişkilidir, ancak daha büyük bir görevi aynı anda hesaplanabilen daha küçük parçalara bölmekle ilgilidir. Daha küçük parçaların sonuçları daha sonra birleştirilerek genel sonuç elde edilebilir. Örnek: tek tek piksellerin renginin esasen bağımsız olduğu ışın izleme.

Muhtemelen bundan daha karmaşıktır, ancak bence bu temel ayrım.


Bu güzel koymak henüz oldukça yanlış. Asenkroniklik gibi, paralellik de kontrol akışının tamamlanmasını beklemeden devam etmesini sağlar.
serkan

13

Bu terimlerdeki farkı düşünme eğilimindeyim:

Asenkron: Uzaklaşın ve bu görevi yerine getirin, işiniz bittiğinde geri dönün ve bana söyleyin ve sonuçları getirin. Bu arada başka şeylerle de uğraşacağım.

Paralel: Bu görevi yapmanızı istiyorum. Bunu kolaylaştırırsa, yardım etmek için birkaç kişi alın. Bu acil bir durum, bu yüzden sonuçlara dönene kadar burada bekleyeceğim. Sen gelene kadar başka bir şey yapamam.

Tabii ki eşzamansız bir görev paralellikten faydalanabilir, ancak farklılaşma - en azından aklımdan - operasyon yapılırken başka şeylerle uğraşmak mı yoksa sonuçlar gelene kadar her şeyi tamamen durdurmak mı.


13

async : Bunu kendiniz başka bir yerde yapın ve tamamladığınızda bana bildir (geri arama). O zaman ben bir şeyler yapmaya devam edebilirim.

resim açıklamasını buraya girin

parallel : İstediğiniz kadar erkek (iş parçacığı) kiralayın ve işi daha hızlı tamamlamak için onlara ayırın ve tamamladığınızda bana bildirin (geri arama). Zamanla ben olabilir benim diğer şeyler yapmaya devam.

resim açıklamasını buraya girin

temel fark paralellik çoğunlukla donanıma bağlıdır.


11

Bu bir icra emri meselesidir.

A, B ile asenkron ise, A'nın alt bölümlerinin B alt bölümlerine göre ne zaman olacağını önceden tahmin edemem.

A, B ile paralelse, A'daki işler B'deki şeylerle aynı zamanda gerçekleşir. Ancak, yine de bir yürütme sırası tanımlanabilir.

Belki de zorluk asenkron kelimesinin anlamsal olmasıdır.

Butlerime daha fazla şarap ve peynir için dükkana koşmalarını söylediğimde zaman uyumsuz bir görev yürütüyorum ve sonra onu unutup tekrar çalışma kapısını çalıncaya kadar romanım üzerinde çalışıyorum. Paralellik burada oluyor, ancak uşak ve ben temelde farklı görevler ve farklı sosyal sınıflarla uğraşıyoruz, bu yüzden bu etiketi burada uygulamıyoruz.

Hizmetçi ekibim, her biri farklı bir pencere yıkarken paralel olarak çalışıyor.

Yarış arabası destek ekibim, her ekibin farklı bir lastik üzerinde çalıştığı ve işlerini yaparken birbirleriyle iletişim kurmaları veya paylaşılan kaynakları yönetmeleri gerekmediğinden eşzamansız olarak paraleldir.

Futbolum (futbol olarak da bilinir) ekibim, her oyuncu saha hakkındaki bilgileri bağımsız olarak işleyip hareket ettiği için paralel çalışma yapar, ancak tamamen eşzamanlı değildir, çünkü başkalarının iletişim kurması ve iletişimine yanıt vermeleri gerekir.

Yürütme bandım da her bir oyuncu müziği okuduktan ve enstrümanlarını kontrol ettikçe paraleldir, ancak oldukça senkronize olurlar: birbirleriyle zaman içinde çalarlar ve yürürler.

Kamlı bir av tüfeği paralel olarak düşünülebilir, ancak her şey% 100 senkronize olduğundan, bir işlem ilerliyormuş gibi.


9

Neden Asenkron?

Günümüz uygulamalarının gittikçe daha fazla bağlı olması ve ayrıca potansiyel olarak uzun süren görevler veya Ağ G / Ç veya Veritabanı İşlemleri gibi engelleme işlemleri ile, bu işlemlerin gecikmesini arka planda başlatarak ve kullanıcı arayüzüne geri dönerek gizlemek çok önemlidir. olabildiğince çabuk. Burada Asenkron resme gelir, Duyarlılık .

Neden paralel programlama?

Günümüzün veri setleri gittikçe büyüyor ve hesaplamalar daha karmaşık hale geliyor. Bu nedenle, bu durumda CPU'ya bağlı işlemlerin yürütme süresini azaltmak, bu durumda iş yükünü parçalara bölerek ve aynı anda bu parçaları yürütmek çok önemlidir. Buna "Paralel" diyebiliriz. Açıkçası uygulamamıza yüksek performans verecektir .


5

Asenkron Diyelim ki müşteriniz için irtibat noktasısınız ve duyarlı olmanız gerekiyor. Şimdi yapılması zaman alan bir işleminiz var ve bu nedenle müşteriye 7/24 yanıt vermeniz gerektiği için bunu kaldıramıyorsunuz. Bu nedenle, zaman harcayan işlemi bir başkasına devredersiniz, böylece yanıt verebilirsiniz. Bu eşzamansız.

Paralel programlama Diyelim ki, bir metin dosyasından 100 satır okumak ve bir satırı okumak 1 saniye sürer. Bu nedenle, metin dosyasını okumak için 100 saniyeniz gerekecektir. Şimdi, işlemin tamamlanması için istemcinin 100 saniye beklemesi gerektiğinden endişeleniyorsunuz. Böylece 9 klon daha oluşturursunuz ve her birini metin dosyasından 10 satır okumuş olursunuz. Şimdi 100 satır okumak için gereken süre sadece 10 saniyedir. Böylece daha iyi performans elde edersiniz.

Özetle, yanıt verebilmek için eşzamansız kodlama yapılır ve performans için paralel programlama yapılır.


4

Asenkron: Bir yöntemi veya görevi engellemeden arka planda çalıştırma. Ayrı bir iş parçacığında zorunlu olarak çalışmayabilir. Bağlam Değiştirme / zaman planlamasını kullanır.

Paralel Görevler: Her görev paralel olarak çalışır. Bağlam değiştirme / zaman planlaması kullanmaz.


4

Buraya iki kavramdan oldukça rahat geldim, ama onlar hakkında net olmayan bir şeyle geldim.

Bazı cevapları okuduktan sonra, farkı tanımlamak için doğru ve yararlı bir metaforum olduğunu düşünüyorum.

Bireysel kod satırlarınızı ayrı ancak sıralı oyun kartları olarak düşünüyorsanız (eski okul kartlarının nasıl çalıştığını açıklıyorsam beni durdurun), o zaman yazılan her ayrı prosedür için benzersiz bir kart yığınınız olacaktır ( kopyala ve yapıştır!) ve kodu normal olarak ve eşzamansız olarak çalıştırdığınızda normalde olup bitenler arasındaki fark, ilgilenip ilgilenmemenize bağlıdır.

Kodu çalıştırdığınızda, işletim sistemine, işlemciye iletilmek üzere bir dizi tek işlem (derleyicinizin veya yorumcunuzun "daha yüksek" seviye kodunuzu kırdığı) verirsiniz. Bir işlemci ile aynı anda yalnızca bir kod satırı yürütülebilir. Dolayısıyla, aynı anda birden çok işlem yürütme yanılsamasını gerçekleştirmek için, işletim sistemi, işlemciye belirli bir işlemden yalnızca birkaç satır gönderdiği ve tüm işlemler arasında nasıl göründüğüne göre geçiş yaptığı bir teknik kullanır. Uygun. Sonuç, aynı anda görünen son kullanıcıya ilerleme gösteren birden fazla işlemdir.

Metaforumuz için ilişki, işletim sisteminin kartları işlemciye göndermeden önce her zaman karıştırmasıdır. Kart desteniz başka bir desteye bağlı değilse, başka bir destenin aktif olduğu sırada destenizin seçilmeyi bıraktığını fark etmezsiniz. Bu yüzden umursamıyorsanız, önemli değil.

Bununla birlikte, ilgileniyorsanız (örneğin, birbirine bağlı birden fazla işlem - veya kart destesi varsa), işletim sisteminin karıştırılması sonuçlarınızı berbat edecektir.

Eşzamansız kod yazmak, siparişin ne olduğuna bakmaksızın yürütme sırası arasındaki bağımlılıkların işlenmesini gerektirir. Bu yüzden "geri arama" gibi yapılar kullanılır. İşlemciye "yapılacak bir sonraki şey diğer yığına ne yaptığımızı anlatmak" diyorlar. Bu tür araçları kullanarak, diğer yığının işletim sisteminin talimatlarını daha fazla çalıştırmasına izin vermeden önce bildirim aldığından emin olabilirsiniz. ("Called_back == false: send (no_operation)" - bunun gerçekten nasıl uygulandığından emin değilim, ama mantıklı olarak, tutarlı olduğunu düşünüyorum.)

Paralel süreçler için fark, birbirinizi umursamayan iki yığının ve bunları işlemek için iki işçinin olmasıdır. Günün sonunda, iki yığının sonuçlarını birleştirmeniz gerekebilir, bu da eşzamanlılık meselesi olacaktır, ancak yürütme için tekrar umursamıyorsunuz.

Bu yardımcı olur emin değilim, ama her zaman birden fazla açıklama yararlı bulabilirsiniz. Ayrıca, eşzamansız yürütmenin tek bir bilgisayar ve işlemcileri ile sınırlı olmadığını unutmayın. Genel olarak konuşursak, zamanla ya da (daha genel olarak konuşursak) olaylarla ilgilenir. Bu nedenle, A düğümünü X ve onun bağlı B yığınını Y'ye bağımlı yığın A gönderirseniz, doğru asenkron kod durumu dizüstü bilgisayarınızda yerel olarak çalışıyormuş gibi hesaplayabilmelidir.


2

Genellikle, her seferinde birden fazla şey yapmanın sadece iki yolu vardır. Biri eşzamansız , diğeri paralel .

Yüksek seviyeden, popüler sunucu NGINX ve ünlü Python kütüphanesi Tornado gibi , her ikisi de Tek iş parçacığı sunucusu aynı anda binlerce müşteriye (bazı IOloop ve geri arama ) hizmet verebilen asenkron paradigmayı tam olarak kullanır . Eşzamansız programlama paradigmasını uygulayabilen ECF (istisna kontrolü takibi) kullanmak . yani eşzamansız bazen gerçekten eşzamanlı bir şey yapmaz, ama eşzamanlı bazı işler, eşzamansız performans gerçekten teşvik edebilir.

Paralel paradigma zaman çoklu iş parçacığı, ve çoklu işlem anlamına gelir. Bu, çok çekirdekli işlemcileri tamamen kullanabilir, işleri aynı anda yapabilir.


-1

Yukarıdaki yanıtların özeti

  1. paralel hesaplama:

▪ verim sorununu çözer. Büyük bir görevi daha küçük parçalara ayırmaktan endişe ediyor

▪ makine ile ilgilidir (çoklu makine / çekirdek / cpu / işlemci gereklidir), örneğin: master slave, harita azaltma.

Paralel hesaplamalar genellikle işi birkaç işlemci arasında dağıtan merkezi bir kontrol içerir

  1. asenkron:

▪ Gecikme sorununu çözer, başka bir şey yapmadan önce pahalı bir işlemin tamamlanması için 'beklemek' sorunu

▪ iplikle ilgilidir (çoklu iplik gereklidir)

Diş açma (Thread, Runnable, Executor kullanarak) Java'da eşzamansız işlemler gerçekleştirmenin temel yollarından biridir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.