AP savunucuları eşzamanlılığın kolay olduğunu iddia ediyorlar çünkü paradigmaları değişmez durumdan kaçınıyor. Anlamadım.
Bu genel soruyu, işlevsel bir neofit olan ancak yıllar içinde yan etkilerde gözlerime kalmış olan ve bunları daha kolay (ya da özellikle "daha güvenli" dahil olmak üzere her türlü nedenden dolayı hafifletmek isteyen biri olarak ele almak istedim. daha az hata eğilimli ") eşzamanlılık. İşlevsel eşlerime ve ne yaptıklarına bakarken, çim biraz daha yeşil görünüyor ve en azından bu konuda daha güzel kokuyor.
Seri Algoritmalar
Bununla birlikte, spesifik örneğinizle ilgili olarak, eğer probleminiz doğada seri ise ve B bitinceye kadar B uygulanamıyorsa, kavramsal olarak A ve B'yi ne olursa olsun paralel olarak çalıştıramazsınız. Eski oyun durumunu kullanarak paralel hamleler yapmayı temel alan cevabınızdeki sıra bağımlılığını kırmanın bir yolunu bulmanız veya diğer cevaplarda önerilen sıra bağımlılığını ortadan kaldırmak için parçalarının bağımsız olarak değiştirilmesine izin veren bir veri yapısı kullanmanız gerekir. veya bu tür bir şey. Fakat kesinlikle bunun gibi kavramsal tasarım problemlerinin bir payı var; burada her şeyi kolayca okulamazsınız çünkü işler değişmez. Bazı şeyler, mümkünse sipariş bağımlılığını kırmanın akıllıca bir yolunu bulana kadar doğada seri olacak.
Daha Kolay Eşzamanlılık
Yani, biz potansiyel olarak önemli ölçüde çünkü o ihtimali performansını iyileştirebilecek yerlerde yan etkileri dahil programları parallelize başarısız birçok durumlar vardır, adı geçen olabilir parçacığı güvenli olmayabilir. Değişebilir durumun (veya daha spesifik olarak dış yan etkilerin) ortadan kaldırılmasının, "kesinlikle diş güvenli" haline getirdiği "diş ipliği güvenli" olabileceği veya döndüğü gibi olduğunu gördüğüm kadarıyla çok yardımcı olur .
Bu ifadeyi biraz daha somutlaştırmak için, size bir karşılaştırıcıyı kabul eden ve bunu bir dizi öğeyi sıralamak için kullanan bir sıralama işlevini uygulamak için bir görev verdiğimi düşünün. Oldukça genel hale getirilmek isteniyor ancak size, her zaman çok iş parçacıklı bir uygulama kullanmanın şüphesiz fayda sağlayacağı gibi bir ölçekte (milyonlarca öğe veya daha fazla öğenin) girdilerine karşı kullanılacağı konusunda kolay bir varsayım vereceğim. Sıralama fonksiyonunuzu çok okuyabilir misiniz?
Sorun, sıralama işlevinizin çağırdığı karşılaştırıcılar olabilir;Fonksiyonu dejeneralize etmeden imkansız olan tüm olası durumlar için nasıl uygulandığını (veya en azından belgelendirildiğini) bilmiyorsanız yan etkilere neden olabilirsiniz. Bir karşılaştırıcı, atomik olmayan bir şekilde içindeki bir global değişkeni değiştirmek gibi iğrenç bir şey yapabilir. Karşılaştırıcıların% 99,9999'u bunu yapamayabilir, ancak bu genelleştirilmiş işlevi, yalnızca yan etkilere neden olabilecek vakaların% 0,00001'i nedeniyle hala okuyamıyoruz. Sonuç olarak, hem tek iş parçacıklı hem de çok iş parçacıklı sıralama işlevi sunmanız ve sorumluluğu iş parçacığı güvenliğine dayanarak hangisini kullanacağınıza karar vermek için bunu kullanan programcılara vermeniz gerekebilir. İnsanlar hala tek parçalı sürümü kullanabilir ve çoklu okuma fırsatlarını kaçırırlar, çünkü karşılaştırıcının iş parçacığının güvenli olup olmadığından emin olmayabilirler.
İşlevlerin şimdi ve gelecek için yan etkilere neden olmayacağına dair kesin güvencemiz varsa, her yere kilit atmadan işlerin iplik güvenliği ile ilgili rasyonelleştirmeye dahil olabilecek bir sürü beyin gücü var. Ve korku var: pratik korku, çünkü bir yarış koşulunu birkaç kez çok fazla zorlamak zorunda kalan herkes,% 110 olamayacağından emin olamayacağından ve bu konuda yaşayacağından emin olamayacağınız konusunda çok tereddütlü olabilir. En paranoyak bile (ki muhtemelen en azından sınırda olduğum), saf işlev güvenle paralel olarak adlandırabileceğimiz rahatlama ve güven duygusunu sağlar.
Ve bu işlevlerin saf işlevsel dillerle elde edeceğiniz iplik güvenliği olduğuna dair sert bir garanti alabiliyorsanız, bunu çok faydalı bulduğum ana durumlardan biri. Diğeri, işlevsel dillerin çoğu zaman, her şeyden önce yan etkileri olmayan işlevler oluşturmayı teşvik etmesidir. Örneğin, size büyük bir veri yapısı girmenin oldukça verimli olduğu kalıcı veri yapıları sağlayabilir ve daha sonra orijinalinden dokunmadan orijinalinden sadece küçük bir kısmı değiştirildikten sonra yepyeni bir ürün çıkartabilirler. Bu tür veri yapıları olmadan çalışanlar, onları doğrudan değiştirmek ve yol boyunca bazı iplik güvenliğini kaybetmek isteyebilirler.
Yan etkiler
Bu, (arkadaşlarımın süper havalı olduğunu düşündüğüm) fonksiyonel arkadaşlarıma saygımdan dolayı bir kısmına katılmıyorum:
[...] çünkü paradigmaları değişken durumlardan kaçınır.
Eşzamanlılığı gördüğüm kadar pratik kılan, mutlaka değişmezlik değildir. Yan etkilere neden olmayan fonksiyonlar. Bir işlev sıralamak için bir dizi girerse, kopyalar ve ardından içeriğini sıralamak için kopyayı mutasyona uğratır ve kopyayı çıktılarsa, aynı girdiyi geçseniz bile, bazı değişken dizi türleriyle çalışan bir iş parçacığı kadar güvenli Birden fazla iş parçacığından diziye. Bu yüzden, çok eşzamanlılık dostu kod oluşturmada hala değişebilir türler için bir yer olduğunu düşünüyorum. Yani, değişmez özellikleri için değil, çok fazla kullandığım kalıcı veri yapıları dahil olmak üzere değişmez türlere ek yararlar sağlamasına rağmen Yan etkileri olmayan fonksiyonlar yaratmak için herşeyi derinlemesine kopyalamak zorunda kalmazsınız.
Sık sık, bazı ek verileri, belki de ekstra bir dolaylı seviyeyi ve kalıcı bir veri yapısının bölümleri üzerine muhtemelen bazı GC'leri kopyalamak ve kopyalamak şeklinde işlevler yapmaktan başka bir şey yapmazsınız; 32 çekirdekli bir makine ve paralel olarak daha fazla şey yapabilirsek, değişimin muhtemelen buna değer olduğunu düşünüyorum.