İnsanları iş parçacığı kullanmaya iten yanlış fikirler nelerdir? [kapalı]


12

Bir programda iş parçacığı uygulamak zordur, evet, ancak neden bazı insanlar için açık bir ihtiyaç olsa bile bunları uygulamazlar.

Bir örnek: Program bir veritabanından bir veri kümesi yüklemelidir, yapılacak şey, bağlantıyı yapmak ve bir çalışan iş parçacığında veritabanından veri almak ve daha sonra GUI'ye yüklemek ve kullanıcı için GUI iş parçacığını yanıtlamak olacaktır. .

Ama hayır, ipliklerin kötü ve kötü olduğunu düşünen insanlarla konuştum ve ne pahasına olursa olsun onlardan kaçınmalı. Hatta bazı sınıf eğitmenlerinin iş parçacığı kullanımına karşı tavsiyede bulunduğunu ve bu nedenle bunların kullanımını kapsamak istemediğini duydum. NE???

Donanım çok çekirdekli hale geldiğinde, iplikleri daha iyi anlamamız ve kullanmaktan korkmamamız gerektiğini düşünüyorum. Ben şahsen büyüleyici bir konu buluyorum.

Peki, diş çekme konusunda duyduğunuz yanlış olan şeyler nelerdir?


Yanlış uyumsuzluklar ve iyileştiriciler iplik işleyemez. Asıl soru şu: bu konuda ne yapacaksın?
İş

3
Bunlar yanlış fikirler değildir, ancak ipliklerden her zaman kaçınılmalıdır. Diş çekme desteğinin zaten doğru bir şekilde ele alınması ve her programcının bunu kendisinin yapması gerekmemesi için mimarinizi doğru şekilde yapın . Programcılar her durumda bir iş parçacığı eklemeyi öğrendikten sonra büyük sorunlar yaşayacaksınız.
tp1

Soruyu size geri döndüreyim. Kendinize paralel işleme yeteneklerinden yararlanmak için alternatif yaklaşımlar olup olmadığını sordunuz mu? Ya da, doğrudan bir beyaz kağıdın söylediği için, ya da belki de daha iyi programcıların havalı olduğunu düşünen şey bu olduğu için doğrudan ipliğe atladınız mı? Şahsen, mesajları birbirine ileten hafif süreçler fikrini seviyorum. Tembel / aptal / acelem var mı? Evet- ve hepimiz, çeşitli açılardan.
user1172763

Yanıtlar:


19

Diş çekme zor

Elbette. Olabilir. Bununla birlikte, insanlar bu fikri kafasına alırlar, o kadar zor ki , anlamaya çalışmaktan rahatsız olmazlar .

İmkansız gibi değil.


2
Bu cevabı destekliyorum. İnsanlar bunun zor olduğunu düşünüyor . Ancak anlamaya çalışmak için yeterince zaman harcadığınız zaman değil.

11
@Pierre, ben zor insanların tanımının o çok beklediğiniz olan "sen anlamaya çalışan yeterli zaman harcamak zorunda".
Benjol

1
TPL ve await/ asyncanahtar kelimelerle iş parçacığı çok daha kolay hale geliyor :)
Rachel

@Pierre 303: Anlamak için yeterince zaman harcadığınızda hala zor ve aslında onu en iyi anlayan insanlar, mümkün olduğunca kaçınmaları en muhtemel olanlardır.
Michael Borgwardt

9

Zor iş parçacığı değil, senkronizasyon ihtiyacı ve iş parçacığı kullanarak gelen diğer her şey. GUI örneğinizde, ana diziye veri kümesine erişilmeye hazır olduğunu nasıl anlarsınız? Bir sürü geri arama yapıyor musunuz? Tüm kontrol değişkenlerini kodunuz boyunca dağıtır mısınız? Silverlight gibi bazı GUI modellerinde, iş parçacığı benzeşimi adı verilen bir şey vardır, bu da diğer iş parçacıklarından ana iş parçacığında oturan GUI öğelerine erişemeyeceğiniz anlamına gelir, bu nedenle ana iş parçacığının belirli bilgilerin daha fazla işlenmeye hazır.

Gerçekten iplikler hakkında hiçbir yanlış şey duymadım. Kullandığınız algoritma doğası gereği paralel olmadığında senkronizasyonun bir orospu olmasıyla ilgili bir sürü durumsal vaka çalışması okudum.


Kendine not: paralel algoritmalar yaz ... teşekkürler.
Droogans

Mesaj kuyrukları (MFC ile aynı). Bununla birlikte, programcıların mesaj kuyruğunu sabote etmemelerini sağlamak (verileri doğrudan bellekte paylaşarak), ateşlenebilir bir suç olsa bile başarısız olmuş gibi görünmektedir.
rwong

3

Diş çekme tüm sorunlarınızı çözer

Performans sorunları yaşıyorsanız gerektiğini değil doğru diş atlamak.

İplikler hafiftir

İplikler onlarca ve yirmili olarak hafiftir. Binlerce parçacığı yumurtlamak değildir.

Diş çekme kolaydır [Java]

Konu oluşturmak kolaydır, bu bundan faydalanacağınız anlamına gelmez.


Sadece kayıt için, Mac OS (varsayılan kurulumda) 512'den fazla iş parçacığı oluşturmanıza izin vermez.
zneak

1
Bu gerçekten sizin dilinize bağlıdır. Erlang'da 1 milyon iş parçacığı oluşturmak, eski bir dizüstü bilgisayarda bile, modern bir sunucuda zar zor fark edilir. Ve aslında, bunlar sadece iplik değil, tam gelişmiş süreçlerdir , yani ipliklerden çok daha ağırdır . Kendi program sayacı ve çağrı yığını (bir iş parçacığının hemen hemen tek şeyidir) yanı sıra, kendi yığınları ve hatta kendi çöp toplayıcıları vardır.
Jörg W Mittag

4
@ Jörg W Mittag: Yorumundan kafam karıştı. Erlang, işletim sisteminin bir iş parçacığı veya işlem oluşturma biçimini nasıl değiştirir?
Steven Evers

1
@SnOrfus: Erlang işletim sistemi iş parçacığı kullanmaz. Şu anda üç ana Erlang uygulaması var: BEAM, HiPE ve Erjang. BEAM ve HiPE, herhangi bir işletim sistemi olmadan bile çalışabilen yerel uygulamalardır ve kendi süreçlerini uygularlar. Erjang, JVM üzerinde çalışır ve fevkalade parlak Kilim kütüphanesini kullanarak işlemleri uygular.
Jörg W Mittag

@ Jörg W Mittag: Soru programcılarm göz önünde bulundurulduğunda.stackexchange.com/questions/28453/… , bunu çok ilginç buluyorum. Teşekkür ederim.
Steven Evers

1

Sonunda, iş parçacığı açısından güvenli olmayan bazı kitaplıkların / işlevlerin kullanımından doğacak çılgın hataları düzeltmek (farkında olmadığınız şey) aşırı senkronizasyon gerektireceğinden, iş parçacığından kaynaklanan kazançları kaybedersiniz.

Eğer iş parçacıkları kullanırsanız o zaman düzeltemeyeceksiniz hata ile karşılaşma olasılığı çok daha yüksek.


Düzeltilemez hatalar? Daha önce bunlardan birini görmedim ..
Adamk

Gerçekten düzeltemeyeceğiniz bir hata görmediniz mi? Zaman içinde ve kullanılabilir ödeme için?
Kamil Szot

Hiç düzeltilemeyen bir hatayla karşılaşmadıysanız, sektörde yeterince uzun süredir bulunmuyorsunuz. 12 yılı aşkın çalışmamda, baktığım her projede, hiç kimsenin çözmediği ve hiç kimsenin nasıl düzeltileceğini, hatta nasıl çoğaltılacağını bilmediği en az bir hata var. Bu, üzerinde çalışmak için istihdam kod ve ben okumak için erişim (açık kaynak kodu) kodu içerir. Hata içermeyen tek yazılım parçası, 2 veya 3 sayfadan daha kısa olan yazılımlardır. Ancak tüm kodunuzu 1 veya 2 sayfa uzunluğunda yapmak hiçbir şeyi tam olarak çözmez, çünkü o zaman entegrasyon hatalarınız vardır.
slebetman

1

Konuları kullanmak zor neden akıllıca özetlemek için: -
Gerçek Şeyler 1) Senkronizasyon ve ne kilitlemek ve ne zaman kilitlemek için dikkatli tasarım kararları gerekir
2) Çalışma süresi akışı üzerinde kontrol yok
3) Zor hata ayıklama
4) (Çok az kez) platform uyumluluğu: - Bununla ilgilenmek için kütüphaneler var

Yanlış Şeyler: -
1) İplik güvenli ve yeniden giriş işlevlerinin kafa karıştırıcı kavramları
2) İplikler kağıt üzerinde iyi görünüyor, ancak uygulanması çok zor


Bunların doğru mu yoksa yanlış mı? OP , doğru olmayan şeyleri sordu ve insanları çok iş parçacıklı programlama yapmaktan korkuttu.
Steven Evers

aslında kilit veya senkronizasyon gerekmez. Ayrıca mesaj geçirme modelleri (örneğin erlang, scala) ve STM modelleri (örn. Clojure) vardır. Üstelik kilit gerektirmeyen iş parçacığı güvenli veri yapıları (java'da ConcurrentHashMap) ve kilit gerektirmeyen atomik ilkeller vardır.
Kevin

1

Kodunuz için test yazmak istemiyorsanız, iş parçacıkları kullanmayın.

İş parçacıkları, işletim sisteminin ve bilgisayar mimarisinin temelini anlamayan tipik 'kopyala ve yapıştır' programcısı için değildir. Programcıların% 90'ı sadece Java'ya aşina olduğundan, bunlar gerçekten iş parçacığı kullanması gereken insanlar değildir. Java konuları "kolaylaştırır" ama ben sadece senkronize yapıları kullanırlarsa kodları iş parçacıkları çalışacağını düşünüyorum programcılar bir sürü gördüm .... uhm hayır.

Olduğu söyleniyor, herkesin bir yerden başlaması gerekiyor, sadece ilk iş parçacığı projenizi şirketlerin üretim arka uç sunucusunu yükselten yapmayın.


İş parçacıklarının doğru şekilde nasıl yapılacağı ile ilgili bazı kaynaklar önerebilir misiniz?
Jonathan

Eminim bu sorun giderildi. Buradan başlamayı deneyin stackoverflow.com/questions/660621/threading-best-practices
cmcginty

Buradaki sorun,% 100 test kapsamına sahip olsanız bile, testlerinizin talimatların paylaşılan kaynaklarla nasıl birleştiği ile ilgili tüm olası sorunları kapatacağını bilemezsiniz. Öte yandan paylaşılan hiçbir şey mimarisi ile çok daha kolay hale geliyor.
Zachary K

1

Bir örnek: Program bir veritabanından bir veri kümesi yüklemelidir, yapılacak şey, bağlantıyı yapmak ve bir çalışan iş parçacığında veritabanından veri almak ve daha sonra GUI'ye yüklemek ve kullanıcı için GUI iş parçacığını yanıtlamak olacaktır. .

Bu durumun en az 4 nedenden ötürü iş parçacığı kullanma zorunluluğunu temsil ettiğini görmüyorum:

  1. Veri alımı çok hızlı olmalıdır.

  2. Birçok İş Hattı uygulamasında, kullanıcının sonucu beklediği 1 veya iki saniye içinde uygulama ile hiçbir ilgisi yoktur. Ayrıca, kullanıcının istenen görevi tamamlamak için herhangi bir şekilde geri gelmesini beklemesi gerekecektir. Öte yandan sorgu akıllıca kodlanabilir, böylece bir seferde yalnızca bilgi dolu bir sayfa alınır ve diğer optimizasyon teknikleri yanıt süresine yardımcı olabilir.

  3. Web tabanlı arayüzlerde, diş açma modeli ile ilgili bağlantılar aktif hale getirilebilir.

  4. İş parçacığı, kabul ettikçe karmaşıklık ekler, hatta bazı geliştiriciler özellik ekleyemeyebilir veya karmaşık kodda hata ayıklayamayabilir.

Benim düşüncem: Yazılım bakımı ve güvenilirliği bir kuruluş için kod zarafetinden daha değerli olduğu için, gerektiğinde iş parçacığı kullanın.


1
İlk noktan bana dağıtılmış bilgi işlemin yanlışlarını hatırlatıyor ( en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing ). Çok sayıda kullanıcı yanıt vermeyen bir arabirim için 2. noktanızdan 1 veya 2 saniyeden fazla beklemek zorunda kaldığında çılgınca tıklamaya başlayabilir ve bu da işleri daha da kötüleştirebilir.
elde edin

@Güvenli, bağlantı ilginç, paylaştığınız için teşekkürler. Kullanıcının odağını her zaman ara yüze, hatta bu gün ve yaşta tüm işe odaklayabileceğimizden emin değilim. E-Ticaret sitelerinde kullanıcının hiç gitmesini istemediğiniz konusunda size katılıyorum.
NoChance

Odaktan bahsetmiyorum. Kullanıcı bir düğmeyi tıklattığında ve veritabanı sorgulandığı için arabirim donar, bir şey yapıldığına dair görsel bir yanıt vermeden, bazı kullanıcılar düğmeyi tekrar tıklamaya çalışır. Ve yeniden. Ardından diğer düğmeleri veya seçenekleri tıklamayı deneyin. Bunu daha iyi bilmesi gereken yöneticiler gördüm.
Güvenli

Sonuç ekranı ilk çizildiğinde, ancak boş gösterildiğinde daha da kötüsü. Mevcut sürümlerin çoğunu bilmiyorum, ancak eski görünümlerde arama sonucu iyi bir kötü örnek. Aramayı başlatırken, büyük bir arama tabanı ile birkaç saniye boyunca "Sonuç kümesi boş" veya bunun gibi bir şeyi gösterir, bulunan ilk sonuçları gösterir. Çok sabırsızsanız veya aceleniz varsa, hiçbir şeyin orada olmadığına inanarak bir sonraki klasöre geçtiniz.
Güvenli

1
@Güvenli, ne demek istediğini anlıyorum. Burada açıkladığınız şey tutarsız bir kullanıcı arabiriminin iyi bir örneğini göstermektedir. Açıkladığınız şey dosyaları ararken de gerçekleşir. Ancak, kullanıcıya aramanın başlamış olduğunu söylemekten başka bunun cevabı nedir?
NoChance
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.