Sezgisel eşzamanlı programlama soyutlamaları ile modern programlama dili [kapalı]


40

Uygulama / kullanıcı seviyesine odaklanarak (sistem programlaması değil) eşzamanlı programlamayı öğrenmekle ilgileniyorum. Eşzamanlı uygulamalar yazmak için sezgisel soyutlamalar sağlayan modern bir üst düzey programlama dili arıyorum. Verimliliği artıran ve eşzamanlı programlamanın karmaşıklığını gizleyen dillere odaklanmak istiyorum.

Bazı örnekler vermek gerekirse, çok iş parçacıklı kod C, C ++ veya Java ile yazmak için iyi bir seçenek düşünmüyorum çünkü IMHO verimliliğim düşüyor ve programlama modelleri sezgisel değil. Öte yandan, verimliliği artıran ve Python ve çoklu işlem modülü, Erlang, Clojure, Scala, vb. Gibi daha sezgisel soyutlamalar sunan diller iyi seçenekler olacaktır.

Deneyiminize ve nedeninize göre neler önerirsiniz?

EDIT: Herkese ilginç cevaplarınız için teşekkürler. Erlang, Clojure, Scala, Groovy ve belki de Haskell: Çünkü gerçekten iyi bir aday olduğu için gerçekten denemeden bir sonuç çıkarmak zor. En ikna edici argümanlarla cevabı oyladım, ama hangisini seçeceğine karar vermeden önce tüm iyi adayları deneyeceğim :)


21
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java. Neden? On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.Yine neden? Aradığınızı daha iyi tanımlamak için sorunuzu genişletin.
yannis

2
Öyleyse tüm buluntularla paralel programlama öğrenmek ister misiniz, yoksa karmaşıklığının bir kısmını gizlemek ve üretkenliğe odaklanmak mı istiyorsunuz?
18'de

@MaR Verimliliğe odaklanın ve karmaşıklığı gizleyin :)
sakisk

Sadece bu dillerin bazılarında birçok önemli kavramın (bazılarının çözülmüş olduğunu söyleyebiliriz) kaçınıldığını ve bu nedenle C'nin eşzamanlılık öğrenmek için en iyi dil olduğunu unutmayın. (Ya da en azından bana öyle geliyor; listelenen tüm diller hakkında yeterince bilgim yok). Verimliliği artırmak, genellikle kapsamlı öğrenmeyle çelişir.
user606723

1
@DeadMG Azalan verimlilik, onların sorunu. Sorunun yerine dilin sözdizimine odaklanmak istemiyorum. Kesinlikle çıkmazlarla mücadele etmek istemem. Basit bir örnek olarak, begin transaction end transactioniçindeki basit ifadeleri kullanmak istiyorum ve içindeki her şey kilitlenmemelidir ve bir bütün olarak başarılı veya başarısız olmalıdır.
sakisk

Yanıtlar:


33

Neredeyse kesinlikle Clojure'a bakmalısınız - bence çok çekirdekli programlama için en modern dil ve son derece verimli.

Anahtar nitelikler:

  • Bu bir var işlevsel dil eşzamanlılık ve üst düzey soyutlamalar kullanarak geliştirmek için yeteneği her ikisi için bir nimet olduğunu. Haskell gibi fonksiyonel dillerde tecrübeli olan herkesin bilmesi gereken tamamen değişmez kalıcı veri yapıları ve tembel dizileri vardır.
  • Değişken duruma eşzamanlı kilitsiz erişim için çok yeni bir yazılım işlemsel bellek sistemine sahiptir. Kod eşzamanlılık güvenli hale getirmek genellikle bir (dosync ....) bloğuna sarmak kadar kolaydır.
  • Makro tabanlı metaprogramming ve kod oluşturma için son derece güçlü kılan bir Lisp . Bu, önemli verimlilik avantajları getirebilir (Paul Graham - "Ortalamaları Yenmek" adlı makale)
  • Bu bir JVM dilidir - Java ekosistemindeki çok sayıda kütüphane ve araçlara erişmekle kalmaz, aynı zamanda JVM'yi eşzamanlı sunucu tarafı uygulamaları için etkili bir platform haline getiren dev mühendislik çalışmalarından da faydalanırsınız. Pratik amaçlar için, bu, üzerine kurulu bu tür bir temeli olmayan diller üzerinde büyük bir avantaj sağlar.
  • It en dinamik - Çok özlü kodunda sonuçları ve verimlilik çok. Bununla birlikte, gerekirse performans için isteğe bağlı statik tür ipuçlarını kullanabileceğinizi unutmayın.
  • Dil, açıklanması biraz zor olan soyutlamalar etrafında tasarlanır , ancak net etki, problemlerinizi çözmek için birleştirebileceğiniz görece dikey bir dizi özellik elde etmektir. Bir örnek, her "sıralı" nesne türüyle ilgilenen bir kod yazmanıza olanak sağlayan dizi soyutlaması olabilir (listelerden, dizelerden, Java dizilerinden, sonsuz tembel dizilerden, bir dosyadan okunan satırlardan vb. Gelen her şeyi içerir).
  • Bir var harika topluluk çok pragmatik en önemlisi, yararlı anlayışlı ama - - Clojure odak "İşleri halletmek" konulu genellikle.

Eşzamanlılık eğimli bazı mini kod örnekleri:

;; define and launch a future to execute do-something in another thread
(def a (future (do-something)))

;; wait for the future to finish and print its return value
(println @a)

;; call two functions protected in a single STM transaction
(dosync
  (function-one)
  (function-two))

Özellikle, bu videolardan bir veya daha fazlasını izlemeye değer:


21
Kesin olarak yazılmış olan dillerdeki statik tip beyanların amacı , "gerektiğinde performansı arttırmak" değildir ve Lisp savunanlarının o eski pipetçiyi kovmasını savunmaktan bıktım. Tip bildirimlerinin iki amacı vardır: belirli derleme zamanı doğruluk garantileri sağlamak ve kodu, özellikle asıl yazardan başka biri için okunmasını kolaylaştırmak. Statik yazmanın sağladığı doğal olarak daha iyi performans sadece bir bonus.
Mason Wheeler

8
Son zamanlarda işyerinde başka bir geliştiricinin JavaScript koduyla çalışmak zorunda kaldım ve bu sürecin en acı veren kısmı: fonksiyon argümanlarında hiçbir tür olmadan, ne yapmaları gerektiğini anlamak için tüm kod tabanı boyunca avlanmak zorundayım. Olmaları ve nereden çağrıldıklarına bağlı olarak ne yapabilecekleri. Eğer JavaScript, genel sözdizimine ek olarak C'nin tip sistemini elinde tutsaydı, bu bir sorun olmazdı.
Mason Wheeler

1
@MasonWheeler: IMHO, tür ek açıklamaları olmadan bir işlevi nasıl çağıracağınızı bulamıyorsanız, belgelerle ilgili bir sorun (veya bunların eksikliği). Ördek tipi dillerde bile, her şey genellikle bazı yapısal tip kısıtlamalarını karşılamalıdır (örneğin, aritmetik işlemleri desteklemeli, yinelemeli, indekslenebilir olmalı, vb.). Onlar işlevi ne hakkında daha ipucu vermediği için Statik türleri yalnızca minimal yardımcı olacağını yapar .
dsimcha

2
@Mason Statik tip bildirimlerinde başka bir avantaj olmadığını söylemedim. Aslında, statik nedenlerle bildirmelerini kesinlikle belirttiğiniz nedenlerden dolayı seviyorum. Bununla birlikte, dinamik yazmanın verimlilik kazanımlarını da seviyorum. Bu bir takas. İyi bir test takımınız varsa, bunun hem doğruluk sağlama hem de yeni gelenlerin doğru kullanımı anlamalarına yardımcı olmak için örnek kod sağlama açısından dinamik yazmanın olumsuz yanlarını azalttığını genel olarak anlıyorum. YMMV.
mikera

1
@ dsimcha - soyutlamaların tasarımına alternatif, somut bir uygulama etrafında tasarım yapmak olacaktır. Örneğin, eski Lisp işlevlerinin çoğu yalnızca eksilerdeki hücrelerde depolanan bağlantılı listelerde çalıştı. Farklı veri yapıları için farklı fonksiyonlara ihtiyacınız vardı. Clojure'da çekirdek kütüphane işlevi sıralı herhangi bir şey üzerinde çalışır (cevabında olduğu gibi).
mikera

27

D'yi deneyebilirsin. Üç model sunuyor. Birinci veya ikinci ya öneririm.

  1. std.concurrency . Bu modülü tüm eşzamanlılık ihtiyaçlarınız için kullanırsanız, o zaman dilin ve standart kütüphanenin bir kombinasyonu, dişler arasındaki izolasyonu zorlar. Konular öncelikli olarak “ilk önce güvenliği” sağlayacak ve düşük seviyeli veri yarışlarına izin vermeyecek şekilde sınırlı hafıza desteği ile mesaj geçişi yoluyla iletişim kurar. Ne yazık ki std.concurrency belgelerinin iyileştirilmesi gerekiyor, ancak model Andrei Alexandrescu'nun "D Programlama Dili" adlı kitabının ücretsiz bir bölümünde belgeleniyor .

  2. std.parallelism . Bu modül, genel durum eşzamanlılığı yerine, özellikle çok çekirdekli paralellik için tasarlanmıştır. ( Eşzamanlılık ve paralellik aynı şey değildir, ancak paralelliği uygulamak için eşzamanlılık gereklidir. ) Paralellik noktasının tamamı performans olduğundan, std.parallelism herhangi bir yalıtım garantisini vermez, çünkü verimli paralel kod yazmayı zorlaştırır. Bununla birlikte, birçok hataya açık düşük düzey ayrıntıyı soyutlar, böylece manuel olarak doğruladığınız iş yüklerini paralelleştiriyorsanız, birbirinden bağımsız olduğunu saptamak çok zordur.

  3. core.thread , işletim sistemine özgü iş parçacığı API'leri üzerinden düşük düzeyli bir sarıcıdır . Hem std.concurrency hem de std.parallelism, başlık altında kullanır, ancak ben sadece kendi eşzamanlılık kitaplığınızı yazıyorsanız ya da std.parallelism veya std'de iyi yapılamayan saçma bir köşe örneği bulursanız kullanmanızı öneririm. .concurrency. Gündelik işler için hiç kimse bu kadar düşük bir şey kullanmamalıdır.


Değişmezliği / saflığı, iş parçacığı yerel deposunu varsayılan olarak ve sırayla sırayla mutasyonu empoze eden paylaşılmalıydı. Düşünceler, uyumlu kod yazmak için C / C ++ dilinde eksik dilleri desteklemektedir.
deadalnix

@deadalnix: Bana göre bunların çoğu std.concurrency modelinin detaylarıdır (izolasyonun nasıl uygulanacağı). Bu yazıyı özlü tutmak istedim.
dsimcha

Aslında hayır. Tutarlılık hem kütüphane hem de dil desteği gerektirir.
deadalnix

@deadalnix: Doğru, ama std.concurrency'i desteklemek için büyük oranda yerine oturdular.
dsimcha

23

Erlang kesinlikle harika bir seçenek, ancak biraz daha pratik bir şey Google'ın yeni dili Go olabilir .

Diğer ortak dillerden çok uzakta değildir, bu nedenle diğer 'kolay' dilleri zaten biliyorsanız bile edinilmesi kolaydır. Birçok kişi bunu programlamak için ne kadar 'rahat' olarak Python veya hatta Lua ile karşılaştırır.


@ Faif, eşzamanlı programlama sistemleri değil uygulama / kullanıcı seviyesi hakkında sorular soruyor. Erlang buna nasıl uyar?
Chiron

@Raynos: Topluma bağlı.
Donal Fellows

@ DonalFellows hakkınız, bence bence çok dardı
Raynos

1
@Chiron: Erlang bir programlama dilidir, uygulamalar oluşturmak için kullanılır. Genellikle, çok işlemli uygulamalar. 'Eşzamanlı proramming sistemleri' olarak nerelere uyduğunu bilmiyorum, Erlang'da yazılmış herhangi bir işletim sistemi duymadım.
Javier,

1
Go öğreticisine hızlıca baktıktan sonra, IMHO'nun (sınırlı) işaretçi kullanan C benzeri bir sözdizimine sahip bir dilin kesinlikle verimliliği artıran modern bir dil olmadığını söylemek istiyorum.
sakisk

23

Net için Microsoft'un Paralel Programlamasına göz atın . Çok sezgisel.

Birçok kişisel bilgisayarda ve iş istasyonunda, birden fazla iş parçacığının aynı anda yürütülmesini sağlayan iki veya dört çekirdekli (CPU) vardır. Yakın gelecekte bilgisayarların çok daha fazla çekirdeğe sahip olması bekleniyor. Bugünün ve yarının donanımından yararlanmak için, çalışmanızı birden fazla işlemciye dağıtmak için kodunuzu paralel hale getirebilirsiniz. Geçmişte, paralelleştirme, dişlerin ve kilitlerin düşük seviyede manipülasyonunu gerektiriyordu. Visual Studio 2010 ve .NET Framework 4, yeni bir çalışma zamanı, yeni sınıf kitaplığı türleri ve yeni tanılama araçları sağlayarak paralel programlama desteği sağlar. Bu özellikler paralel gelişimi basitleştirir, böylece doğrudan bir iş parçacığı veya iş parçacığı havuzu ile çalışmak zorunda kalmadan, doğal bir deyimle verimli, ince taneli ve ölçeklenebilir bir paralel kod yazabilirsiniz. http://i.msdn.microsoft.com/dynimg/IC292903.png


+1 Bu tam olarak istediği şey. Bununla birlikte, sorunlar ortaya çıktığında, daha düşük bir düzeyde eşzamanlılık anlayışı olmadan bunları hata ayıklamak zor olacaktır. Bunu bir C # acemi olarak kabul etmek ... ilginç olduğunu kanıtlayabilir.
P.Brian.Mackey

@ P.Brian.Mackey - Katılıyorum. Ancak bu nadir değildir, ilişkisel modeli ve
SQL'yi

1
Özellikle PLINQ. Yalnızca küçük bir alt görev grubu için faydalı olsa da kullanımı çok kolay olabilir .
svick

21

Hem Erlang hem de Scala, sezgisel ve öğrenmesi kolay bulduğum aktöre dayalı eşzamanlılığa sahip.

Bilgisayar bilimlerindeki Aktör modeli, eşzamanlı sayısal hesaplamanın evrensel ilkeleri olarak "aktörlere" davranan matematiksel bir eşzamanlı hesaplama modelidir: aldığı bir mesaja cevaben, bir aktör yerel kararlar verebilir, daha fazla aktör yaratabilir, daha fazla mesaj gönderebilir ve alınan bir sonraki mesaja nasıl cevap vereceğinizi belirleyin ... Hem hesaplamanın teorik olarak anlaşılması için bir çerçeve hem de eşzamanlı sistemlerin birkaç pratik uygulaması için teorik bir temel olarak kullanılmıştır.


19

Şu anda Haskell'i öğreniyorum ve bu makaleyi okumak beni Haskell'in eşzamanlı programlama için iyi bir seçenek olduğuna ikna etti. Tamamen işlevsel olduğu için (tür sistemi bir işlevin herhangi bir girdi, çıktı veya okuma / değiştirme yapıp yapmadığını bilir), işlemlere benzer şekilde davranan Yazılım İşlemsel Belleği (yukarıdaki kağıtta çok güzel bir şekilde toplanır) gibi şeyler yapabilir. veritabanlarında - sadece biraz ekstra şeker ile atomiklik gibi hoş şeyler bir sürü olsun. AFAIK, Haskell dişleri de çok hafiftir. Bunlara ek olarak, Haskell'in tamamen işlevsel olması, basit görevlerin bile tek bir anahtar kelimeden (par) çok daha azına paralel olarak çalıştırılmasını sağlar. kaynak


7

Google’ın GO dilinin eşzamanlılık için bazı ilginç araçları vardır - bu da denemek için eğlenceli bir şey olurdu. Bakınız: http://golang.org/doc/effective_go.html#concurrency ve örnekler için biraz okuyun.

Eşzamanlı programlama büyük bir konudur ve burada yalnızca Go'ya özgü bazı vurgulamalar için yer vardır.

Birçok ortamda eşzamanlı programlama, paylaşılan değişkenlere doğru erişim uygulamak için gerekli olan incelikler tarafından zorlaştırılır. Go, paylaşılan değerlerin kanallar arasında aktarıldığı ve aslında ayrı yürütme başlıkları tarafından aktif olarak paylaşılmadığı farklı bir yaklaşımı teşvik eder. Sadece bir goroutine herhangi bir zamanda değere erişebilir. Veri yarışları tasarım yoluyla gerçekleşemez. Bu düşünce tarzını teşvik etmek için onu bir slogana indirdik:

Belleği paylaşarak iletişim kurmayın; bunun yerine, iletişim kurarak hafızayı paylaşın.

Bu yaklaşım çok ileri götürülebilir. Referans sayımları, örneğin bir tamsayı değişkeni etrafına bir muteks koyarak en iyi şekilde yapılabilir. Ancak, üst düzey bir yaklaşım olarak, erişimi kontrol etmek için kanalların kullanılması net ve doğru programlar yazmayı kolaylaştırır.

Bu model hakkında düşünmenin bir yolu, bir CPU üzerinde çalışan tipik bir tek iş parçacıklı programı düşünmektir. Eşitleme ilkellerine gerek yok. Şimdi böyle bir örnek daha çalıştırın; onun da senkronizasyona ihtiyacı yok. Şimdi bu ikisinin iletişim kurmasına izin verin; Eğer iletişim senkronize ediciyse, diğer senkronizasyona hala ihtiyaç yoktur. Unix boru hatları, örneğin, bu modele mükemmel bir şekilde uyar. Go'nun eşzamanlılık yaklaşımı, Hoare'in Sıralı İşlemleri İletme (CSP) 'de ortaya çıkmasına rağmen, Unix borularının tip güvenli bir genellemesi olarak da görülebilir ...


6

Bir sonraki sürümde, C #, diyagramın gösterdiğinden daha kolay hale getirir. İki yeni anahtar kelime Async ve Await var.

Zaman uyumsuzluk, işlev değiştirici olarak kullanılır ve "bu işlem işini başka bir iş parçacığında gerçekleştirir" der.

Bekleme, bir Async işlevi içinde kullanılır ve sihrin olduğu yer burasıdır. Temel olarak Await, derleyiciye anahtar kelimeyi takip eden işlemi ayrı bir dizide çalıştırmasını ve sonuçları beklemesini söyler. Bekletme çağrısından sonraki herhangi bir kod işlemden sonra çalışır.

Ayrıca, işlem çağrılan iş parçacığına senkronize olur (bu nedenle, bir düğmeye tıklanmaya yanıt olarak bir eşzamansız işlem yapıyorsanız, manuel olarak UI iş parçacığına geri göndermeniz gerekmez). İki küçük anahtar kelime ile çok sayıda eşzamanlılık gücü elde edersiniz. Burada daha fazla oku


İyi bir işletim sistemi C # derleyicisinin C # 5, zaman uyumsuz ve beklediğini zaten unutmayın.
Raynos

Temel olarak Await, derleyiciye, anahtar kelimeyi takip eden işlemi ayrı bir dizide çalıştırmasını ve sonuçları beklemesini söyler. Acaba bu cevabı doğru mu - async bekliyor konu ile ilgili değil. Bu makalede
anlatılanlar

İyi bir nokta. Sanırım bu konuda da basitçe konuşuyordum. Asıl olan, “beklemede” olan ve işin yapıldığı sırada abone olan “devam” anlamına geliyor. Ve evet, belirli G / Ç işlemleri ve thread.sleep () (temelde bir saat kesilmesine cevap veren) bir dişe sahip değildir. peki G / Ç beğenmeyen el ile yapılan Görevler, beklenen bir fibonacci hesaplayıcısı yaptığımızı söylesin. Teknik olarak makale doğru değil "Konu yok" ama gerçekte hiçbir zaman olmadı, her zaman işletim sisteminin bizim için yaptıklarının detaylarını gizlemek için kullandığımız bir kavramdı.
Michael Brown

6

Hala C ++ 'ı öneriyorum. Uygun eşzamanlı kod yazmak için gerekli soyutlamaları yapabildiğinden daha fazlasıdır. Muazzam olasılık, işi yapmak için iyi bir kütüphaneye sahip olmamanızdır , çünkü işi yapmak için iyi kütüphaneler nispeten yenidir ve aslında C ++ kuyularını kullanma bilgisi tam olarak yaygın değildir. Intel'in TBB'si yalnızca birkaç yıldan beri var ve Microsoft'un PPL'si yalnızca geçen yıldan beri sevk edildi.

Eğer TBB veya PPL gibi bir şey kullanırsanız, eşzamanlı kod, iyi, tam olarak değil önemsiz olduğunu eşzamanlılık önemsiz asla sürece, yazma, ancak uzak çetin dan. Doğrudan pthreads veya Win32 dizileri kullanıyorsanız, bundan hoşlanmanıza şaşmamalı - pratikte böyle işlevlerle assembler'a yazıyorsunuzdur. Fakat PPL ile, o zaman sizin için paralel hale getirilmiş standart fonksiyonel algoritmalar, eşzamanlı erişim için genel veri yapıları ve bu tür iyi şeyler hakkında konuşuyorsunuz.


1
Boost.Threads veya C ++ 0x std::thread(ya da std::tr1::thread) kontrol edin. Bu aslında çok iyi bir soyutlama, IMO.
greyfade

1
@greyfade: PPL veya TBB'de kesinlikle hiçbir şeyleri yok. boost::threadsadece biraz RAII olan bir işletim sistemi sarıcısıdır. PPL ve TBB gerçek eşzamanlı algoritmalar, konteynırlar, vb.
DeadMG

6

Paralellik ve eşzamanlılık için tüm üst düzey soyutlamalara sahip olduğundan Ada için bir eklentiye ihtiyaç vardır. aksi takdirde görev olarak bilinir . OP'in sezgisel olarak sorulduğu gibi (öznel kriterler!), Java merkezli dünyaya farklı bir yaklaşımın takdir edilebileceğini düşünüyorum.


5

Öneririm Groovy / Java / GPars bunu sıralı işlemleri (CSP), veri paralellik, yazılım işlem bellek (STM), ajanlar iletişim, aktörler, dataflow için izin verdiği merkezli JVM olabiliyorsa, ... Burada mesele olduğunu orada her biri farklı "tatlı noktalara" sahip olan birçok üst düzey eşzamanlılık ve paralellik modelleri. Yapmaya çalıştığınız bir sorunun çözümüne uygun olmayan bir model kullanmak istemezsiniz. Sadece tek bir model içeren diller ve çerçeveler sizi algoritma kırma işlemine zorlar.

Tabii ki Groovy ve GPar’lara katkıda bulunduğum için yanlı görünebilirim. Öte yandan, CSP ve Python ile çalışıyorum, cf. Python-CSP.

Bir başka nokta, asıl sorunun bir üretim sistemi yazmak değil, öğrenme ile ilgili olmasıdır. Dolayısıyla Groovy / Java / GPars kombinasyonu, nihai üretim çalışması C ++ 'ta JVM tabanlı olmak yerine Just :: Thread Pro veya TBB gibi bir şey kullanılarak yapılsa bile, öğrenme için iyi bir yoldur.

(Bazı makul mantıklı URL bağlantılarının, ana sitenin spam göndermesine dair panik nedeniyle kaldırılması gerekiyordu.)


Russel, istersen, bana Sohbet odasında ne istediğini söyleyebilirsin, ben de senin için ekleyeceğim: chat.stackexchange.com/rooms/21/programmers
Dan McGrath

4

Clojure'den ne haber? Örneğin Swing'i kullanabilirsiniz ancak Clojure eşzamanlı programlama özelliğinden yararlanabilirsiniz? Clojure oldukça iyi bir Java entegrasyonuna sahiptir.

Ayrıca, Java 7 Fork / Join çerçevesini düşündünüz mü?


2

Ayrıca Groovy ve GPars kütüphanesine bakmak isteyebilirsiniz . GPars BTW biraz başka bir cevapta belirtilen .NET Paralel Uzantısına benziyor, ancak Groovys esnek sözdizimi bazı durumlarda daha iyi okumasını sağlıyor.


0

Scala, sorularda ve cevaplarda defalarca dile getirildi, ancak ben hem Scala hem de Java ile kullanılabilecek bir aktör uygulaması olan Akka'ya bir referans görmedim .


Bu sorunun nesi var? Başka bir cevap yok akka, ve akka eşzamanlı programlama için üst düzey bir soyutlama uygular.
Giorgio,

-1

Sanırım ne inşa ettiğine bağlı. Masaüstü uygulamaları veya sunucu? Bunu duydum (ancak kişisel tecrübem yok) node.js sunucular için eşzamanlı programlama için harika (hem kod yazma hem de performans açısından). Yeni bir sunucu uygulaması yazmak isteseydim, muhtemelen denerdim. Masaüstü uygulamaları hakkında emin değilim ... C # dilinde oldukça fazla miktarda yazı yazdım ve karmaşıklığı güzel bir şekilde gizleyen bazı araçlar var, ancak diğer durumlarda başa çıkmak zorundasınız.


-1

Bunun için kafama çarpabilirim ama TAOUP'un 7. bölümünü okudun mu? Özellikle düşündüğüm bölüm, süreçler ve iş parçacıklarıdır. Eşzamanlı işlem kavramının çoğu insanın iplikler hakkında düşünmesini sağladığını buldum, ancak daha önce hiç iş parçacığı kullanmaktan daha kolay ve daha hızlı bir çocuk süreci ortaya çıkarmaktan daha kolay bir örnek görmedim.

İşletim sisteminizi kuran akıllı adamlara eşzamanlılık yönetimi ile ilgili tüm ayrıntıları araştırıyorsunuz. Halihazırda birçok iletişim yöntemi var ve paylaşılan kaynakların kilitlenmesi konusunda endişelenmenize gerek yok. Temel olarak, dişler optimizasyon kuralına giren bir verimlilik kesimidir. Gereklilik için test yapmadıysanız, optimize etmeyin.

Python için elçi gibi iyi bir alt işlem kitaplığı bulun . Veya C'ye birkaç ayrı program yazabilir ve alt işlemlerle yumurtlamak ve iletişim kurmak için çatal ve boruyu kullanmak için başka bir "ana" program yazabilirsiniz .


3
Bu, OP'nin açıkça istediklerinin tam tersi… bir sürecin ortaya çıkması, bir ipliğin manuel olarak ortaya koyulması kadar düşük. OP, eşzamanlılığın üst düzey soyutlamaları ile ilgilenmektedir .
Konrad Rudolph
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.