2016-03-20 25 views
1

Borulama sırasında ilginç bir problemle karşılaştım. Tek bir ana işlem ve birden çok alt işlemim olması gibi, borular arasındaki eşzamansız davranışı taklit etmek istediğimi varsayalım. Ebeveyn ve çocuk süreçleri birbiriyle konuşabilir. Ancak, karşılaştığım bir şey, iletişim şu ana kadar atomiktir. Ben bir veri kümesi varsaBorularla asenkronize davranışını gerçekleştirme

  • 1. Öncelikle bir döngü aracılığıyla çocuklara veri kümesinin bir veri parça_boyutu gönder
  • 3. Çocuklar tüm çocukları
  • 2. yaratmak olduğunu, bazı hesaplama yapar veya hiçbir şey ve
  • 4. Veli onun çocukları Ancak

verileri aldıktan geri ebeveyne verilerini geçirir, bela benim iletişim atomik olmasıdır, ben bütün veri göndermek zorunda ve sonra oku. Gönderme, çocuk neredeyse anında okunduğundan ve böylece boru doldurma konusunda endişelenmenize gerek olmadığı için iyidir. Ancak, tüm çocuklar işlerini yapıyorlar ve verilerini geri gönderiyorlar, ancak ebeveyn tüm verileri göndermeyi bitirene kadar bunu okumaz. Yani, bir ebeveyn, numaralı adıma bile ulaşmadan önce, adımında çocukların bir ebeveyni ebeveynine kadar doldurabilir. Bundan kaçınmanın bir yolu, sadece veri göndermemiz ve daha sonra başka bir veri seti göndermeden önce almamızdır, ancak bu bir şekilde tüm noktayı mahveder. Başka bir yol yine fork() için ve bununla başka bir çocuk anlaşma var. Ama bu sadece sorunu başka bir yere taşıyor. Bunun tasarımımla ilgili bir sorun olduğunu düşünüyorum, ancak imkansız görünüyor çünkü tek bir süreçteki kodum aynı anda iki yerde olmalı! (Bu reading ve çocuklara writing veri). Bu metodolojide sadece borular kullanarak "gerçek" eşzamansız davranış tasarlama konusunda en iyi uygulama ya da arka görüş var mı?

+1

Tam olarak ilgilendiğiniz şey net değil. "Bir çocuk için ebeveynlerden birine bir boru doldurabilir". Bu doğru ama neden senin için bir problem olduğunu belirtmelisin. Boru doldurursa, çocuk işlemi "yazma" çağrısını engeller. Bu istenen davranış olabilir veya olmayabilir. Eğer değilse o zaman neden ve ne tür davranışlar elde etmeye çalıştığınızı açıklamanız gerekir. Hangi "uyumsuz" davranışı yerine getirmeye çalıştığınıza bağlı olarak, yaygın teknikler, ya "select" ya da 'poll' ya da threading gibi bir şey kullanarak IO multiplexing kullanmaktır. – kaylum

cevap

2

Bunu select kullanarak yapabilirsiniz. Borularınızdan herhangi birinin okunmaya veya yazılmaya hazır olduğunda bunu seçin.

+0

Do * not *, yeni kodda 'select()' komutunu kullanın. Bunun yerine 'poll()' seçeneğini kullanın. – Dummy00001

İlgili konular