ما هي أفضل طريقة لتنفيذ المهام بالتوازي في Ksh وPerl؟

StackOverflow https://stackoverflow.com/questions/248332

سؤال

لدي هذا المشروع الكبير بلغة C++ والذي أحتاج إلى بنائه على نظام أساسي لا يحتوي على نظام موازٍ (مثل make -j على Linux).يحتوي الخادم على 6 وحدات معالجة مركزية وأريد إجراء بناء متوازي يدويًا.

يمكنني إنشاء قائمة مهام مثل هذه لحوالي 300 ملف كائن.أستخدم Makefile للتحقق من التبعية والبناء المتزايد:

جعل -f Makefile obj1.o

جعل -f Makefile obj2.o

جعل -f makefile obj3.o ...

كيف يمكنني تنفيذ هذه المهام بالتوازي مع تشغيل ما لا يزيد عن 6 مهام في وقت واحد باستخدام Ksh وPerl؟(جافا أو بايثون غير متوفرين :-())

هل كانت مفيدة؟

المحلول

في بيرل ويجب أن ننظر في بالتوازي :: ForkManager . هل يمكن أن تفعل شيئا من هذا القبيل:

my @make_obj = qw(
  obj1.o
  obj2.o
  obj3.o
  ...
);

my $fm = $pm = new Parallel::ForkManager(6);
foreach my $obj (@make_obj) {
  $fm->start and next;
  system("make -f Makefile $make_obj");
  $fm->finish();
}

نصائح أخرى

وبديل لالتفرع لتشغيل كل جعل في موضوع خاص بها.

use threads;

my $max_threads = 5;

my @targets = qw(obj1.o obj2.o obj3.o ...);
while(@targets) {
    my $num_threads = threads->list(threads::running);
    if( $num_threads < $max_threads ) {
        my $target = shift @targets;
        threads->create(sub { return system "make $target" });
    }
}

وأنا للأسف ناحية التلويح حول اثنين من البتات. الأول هو جعل حلقة الانتظار quiescently حتى انتهاء الموضوع. وأعتقد أن هذا ويتم إنجاز باستخدام خيوط :: الصورة المشتركة cond_wait () ومتغير الإشارة.

والثاني هو الحصول على قيمة الإرجاع من جعل، لذلك يمكنك أن تعرف إذا فشل شيء ولوقف البناء. للقيام بذلك عليك أن ينضم () كل موضوع للحصول على النتيجة من النظام ()، عملية "رمز إنهاء.

وعذرا على الرد المتسرع. نأمل أن المجتمع في ملء بقية.

هل جنو تجعل على HPUX يكن لديك علم -j؟

http://hpux.connect.org.uk/ HPPD / HPUX / جنو / مستحضرات 3.81 /

باستخدام GNU Parallel يمكنك كتابة:

parallel -j6 make -f Makefile obj{}.o ::: {1..500}

تركيب 10 ثواني:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

يتعلم أكثر: http://www.gnu.org/software/parallel/parallel_tutorial.html https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

وإذا كان نظام التشغيل هو التعامل بشكل صحيح التواصل بين المعالج وجدولة، يجب أن تكون فقط قادرة على رمي كل الانواع في عمليات backgrounded، طالما لا توجد الترابط.

إذا انهم جميعا المستقلة، وأود أن يصدر سلسلة من الأوامر مثل هذا:

make -f Makefile obj1.o &
make -f Makefile obj2.o &
...
make -f Makefile objn.o &

ومع التبعيات، سلسلة لهم العطف المزدوجة (&&) بحيث لا يبدأ البند يعتمد حتى ينتهي بها "الأم".

وأنا أدرك أن ليست تماما الحل المطلوب، ولكن كيف لي أن مهاجمة المشكلة:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top