Çoklu iş parçacığının gereğinden fazla kullanılıp kullanılmadığını nasıl anlayabilirim?


15

Şu anda çoklu iş parçacığı kullanmakta olduğumu hissediyorum.

A, B ve C olmak üzere 3 tip veri var.

Her biri Abirden çok Bs'ye dönüştürülebilir ve her biri Bbirden çok Cs'ye dönüştürülebilir .

Sadece Cs tedavisi ile ilgileniyorum .

Bunu birkaç dönüştürme işlevi ile kolayca yazabilirim. Ama ben kendimi, parçacığı ile uygulamadan üç kuyruklar (yakalandı queue_a, queue_bve queue_c). Farklı dönüşümleri yapan iki iş parçacığı ve bir çalışan var:

  • ConverterA'den okur queue_ave yazarqueue_b
  • ConverterB'den okur queue_bve yazarqueue_c
  • Worker her öğeyi queue_c

Dönüşümler oldukça sıradan ve bu modelin çok kıvrımlı olup olmadığını bilmiyorum. Ama bana çok sağlam geliyor. Her "dönüştürücü" veri kuyruklara ulaşmadan önce bile çalışmaya başlayabilir ve kodda herhangi bir zamanda yeni As veya Bs gönderebilirim ve dönüşüm hattını çalışan tarafından bir işi tetikleyecek Konu.

Ortaya çıkan kod bile daha basit görünüyor. Ama basit bir şey için konuları kötüye kullandığımdan hala emin değilim.


5
Bence bu sorunun peşine düşmek için biraz kısaltılması gerekiyor. Başlık da yanıltıcıdır - bir rantta başlamak üzeresiniz (öyle olmasanız bile). Belki de "Çok iş parçacığı gereğinden fazla kullanıyorum mı?" Sorusuna daha yakın bir şey sormalısınız.
KChaloux

@KChaloux katılıyorum. Düzenledim ve umarım düşüncelerimi biraz daha iyi yakalar.
exhuma

4
@exhuma Harika.
-1'iniz

3
@KChaloux ... tuvalet ziyaretinin düşünce sürecinize getirebileceği fark ... :)
exhuma

Bu çevrimiçi PDF kitabı, Olgun Optimizasyon El Kitabı (birkaç gün önce yayınlandı), bir modülün genel sistem performansı üzerindeki etkisinin bazen modülün yürütme süresinin çok daha fazla olabileceği sistematik etkilerden bahseder .
rwong

Yanıtlar:


17

Sıralı düşünmek ve daha sonra iş parçacığı kullanarak daha iyi çalışacak şekilde bu mantığı değiştirmek neredeyse her zaman daha kolaydır. Ve ifade ilerledikçe, "Eğer kırık değilse düzeltmeyin." Çoğu programcı, iş parçacığı kullanmaz çünkü onları kullanmaya gerek yoktur.

Onları kullanırken daha rahat hissediyorsanız, size daha fazla güç. Ancak, eğer iş parçacıkları darboğazları ortadan kaldırarak bir hız artışı sunmazsa, programınızı neredeyse kesinlikle yavaşlattığını bilin.

Ayrıca, bir işlem için yalnızca bir CPU ayıran sistemlerin, kaynaklardan tasarruf etmek için tek bir iş parçacığıyla birden çok iş parçacığını simüle edeceğini düşünün (akıllı telefon uygulamaları hala bu kötüye kullanıma çok fazla maruz kalsa da, bu modern bilgisayarlarda sık sık gerçekleşmez). Bu durumda, iş parçacığı kullanarak darboğazları ortadan kaldırsanız bile, iş parçacığı kullanmadığınızdan daha yavaş olacaktır .

Ve belki de iplikleri kullanmak için dikkatli olmanın en ince nedeni, ama kesinlikle en az önemli olmayan iplikler, beklemediğiniz şeyi yapma eğilimindedir. Evet, önlem alıyorsanız, iyi olmalısınız. Evet, evreleriniz evreler arasında paylaşılan değişkenlere yazmıyorsa, iyi olmalısınız. Bununla birlikte, iplikle ilgili hataların bulunması çok zordur. Bir programcının koddaki hataları yaratma olasılığını tamamen ortadan kaldıramayacağı ve bu nedenle bir programcının tamamen ortadan kaldırmaya odaklanmak yerine olası hatalara karşı koruma önlemleri alması gerektiği fikrinden dolayı, bu fikri kesinlikle iplik hataları bulmak için. Başka bir deyişle, en iyi çabalarınıza rağmen,

Yani yine de iş parçacıkları kullanmalı mısın? Sağlıklı bir iş parçacığı bilgisi, özellikle de iyi olursanız, kesinlikle kötü bir şey değildir. Ancak, geçlerin hareketi node.js gibi tek iş parçacıklı dillere doğru olmuştur. Tek bir iş parçacığına sahip olmanın temel avantajlarından biri, ölçeklemenin kolay olması ve talimatların sırayla çalıştırılmasının beklendiğini biliyorsanız bazı optimizasyonların yapılabilmesidir (optimizasyonlar paralel olarak çalıştırılabilen talimatlar, eşzamansız olarak çalıştırılabilir).

Dedi ki, senin için en rahat olanı yap diyorum. Deneyimlerime göre, anladığınız bir programın yazılmasının daha hızlı çalışmasını sağlamaktan daha yüksek önceliği vardır. Programı yazmanıza yardımcı olduğunu düşündüğünüzde iş parçacığı kullandığınızdan emin olun ve daha hızlı çalışmasını istediğiniz için değil, çünkü programı yazarken performans hakkında çok fazla endişelenmemeniz gerekir (optimizasyon önemlidir, ancak ayrıca bekleyebilir).


İlginç noktalar yapıyorsunuz. Benim durumumda, dönüşüm boru hattı performans ile ilgili değildir. Kod basitliği / okunabilirliği ile ilgilidir. Çalışan iş parçacığı olan performansı hakkında. Her son görev uzak bir makinede çalışır ve birden fazla iş göndermek işin çok daha hızlı çalışmasını sağlar.
exhuma

2
@exhuma Birden çok iş parçacığı üzerinden paralel yürütmenin yanı sıra, Futures / Promises gibi zaman uyumsuz teknikler veya geri arama odaklı bir stil de kullanabilirsiniz. Yinelemeleri / akışları zincirleyerek boru hatlarını modelleyebileceğinizi unutmayın; aslında iş parçacığı kullanmaya gerek yoktur - birden fazla CPU kullanmak istiyorsanız (ağ kodunda, bu neredeyse hiç böyle değildir)
amon

@exhuma Evet, iş parçacıkları genel olarak performansa yardımcı olur. Demek istediğim, çok yavaş olduğu için yapmıyorsanız, programınızı yazmanıza yardımcı olduğu için yapmalısınız. Optimizasyon daima daha sonra yapılmalıdır. Programınızdan iş parçacıklarının kaldırılması bile onu optimize ediyor olabilir (ancak çoğu programcı için durum böyle değildir).
Neil

OT: Avatarını seviyorum. Beni gulduruyor.
Marjan Venema

@ exhuma, bu yanıta katılıyorum, ancak kodun basitliği için iş parçacıkları kullanacaksanız, bu iyi, ancak iş parçacığı güvenliğini ve çoklu iş parçacıkları ile potansiyel gotchas'ı anladığınıza çok dikkat edin. Çok iş parçacıklı kodun basit bir parçası gibi görünen şey, kolayca izlenmesi çok zor hataların ortaya çıkmasına neden olabilecek gizli yarış koşullarına sahip olabilir.
Ben Lee
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.