بيرل موازية :: Forkmanager Wait_all_all_children () يأخذ وقتا طويلا لفترة طويلة

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

سؤال

لدي برنامج نصي يستخدم Parallel::ForkManager. وبعد ومع ذلك، فإن عملية Wait_all_all_children () تستغرق وقتا طويلا بشكل لا يصدق حتى بعد اكتمال جميع عمليات الأطفال. الطريقة التي أعرفها هي عن طريق طباعة بعض الطوابع الزمنية (انظر أدناه). هل لدى أي شخص أي فكرة عما قد تسبب هذا (لدي 16 CPU CORES على جهازي)؟

my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
    $pm->start($i) and next;

    ... do something within the child-process ...

    print (scalar localtime), " Process $i completed.\n";
    $pm->finish();
}
print (scalar localtime), " Waiting for some child process to finish.\n"; 
$pm->wait_all_children();
print (scalar localtime), " All processes finished.\n"; 

بوضوح، سأحصل على Waiting for some child process to finish الرسالة أولا، مع زمني، يقول، 7:08:35. وبعد ثم سأحصل على قائمة Process i completed الرسائل، مع آخر واحد في 7:10:30. وبعد ومع ذلك، أنا لا أتلقى الرسالة All Processes finished حتى 7:16:33(!). لماذا تأخير لمدة 6 دقائق بين 7:10:30 و 7:16:33؟ شكرا!

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

المحلول

حاولت هذا:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    printf "%s : Process %d completed\n", scalar localtime, $i;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime; 

أنا أخذت:

سينان @ Archardy SRC] $ ./y.pl Thu 11 17:14:16 2010: عملية 3 مكتملة الخميس 11 مارس 11:14:16 2010: في انتظار بعض الطفل لإنهاء الخميس 11 17:14:18 2010 2010 : عملية 8 مكتملة ثو 11 مارس 17:14:18 2010: عملية 14 مكتملةu003Csnip> ...u003C/snip> Thu Mar 11 17:14:34 2010: عملية 12 مكتملة الخميس 11 مارس 17:14:34 2010: جميع العمليات الانتهاء.

لدي perl 5.10.1 على لينكس مع موازية :: forkmanager. الإصدار 0.7.5.

لذلك، أختتم أن مهما كانت القضية التي تجريها كنتيجة لما يحدث عندك

# ... do something within the child-process ...

تحديث: المشكلة هي، أنت تطبع Process finished message قبل ذلك finish يتصل. جرب الإصدار التالي:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
    printf "%s : Process completed: @_\n", scalar localtime
});

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime;

يرى الاحتياطات بالتوازي :: وثائق Forkmanager للمزيد من المعلومات. إذا اختفى التأخير، فإن الأعراض التي تراقبها كانت ترجع إلى حقيقة أنك تدعي أنها قد انتهت العملية المترتبة عليها قبل القيام بذلك.

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