Как я могу заставить всех моих дочерних (одинаковых) детей выполнять одновременно? - PullRequest
1 голос
/ 10 марта 2011

У меня есть процесс, в котором я хочу, чтобы основной поток проходил через цикл и создавал n детей, каждый из которых должен спать в течение j секунд, а затем (более или менее) одновременно просыпаться и выполнять свое дело.

Мой код выглядит следующим образом [Отредактировано согласно запросу Dre]:

 #THE IDEA HERE IS SOMETIMES I WANT TO HOLD THE 
SMS DELIVERY FOR $smsDelay number of seconds 
    if($smsDelay){
            my $forkPid = fork();
            if($forkPid){
                next;
            }
            elsif($forkPid == 0){
                                #db connection disappears while children wait, so, need to reconnect (probably not the best way to handle THIS either! :)
                $myDbC = DBI->connect([DBLOGIN STUFF]) or myDie("can not connect to db");
                &logData("WAITING $smsDelay SECONDS TO SEND SMS");
                sleep($smsDelay * 1);
                $t = time();
                print "sending SMS";
                &send_sms_message($userPN, $smsText , $smsCampaignId);
                print "SMS sent";       
                my $smsVerification = &getDeliveryStatus($userPN, '.smslog');       
                &logData("SMS delivery for $userPN, filename:$filename. Status = $smsVerification");
                #save mms, sms, response code in db
                &runSQL([SQL HERE]);
                exit; #this should only exit the fork, not the entire process!
            }
        }else{
            #HERE I WOULD SEND SMS IMMEDIATELY WITHOUT DELAY

        }

То, что я вижу, - это то, что каждый ребенок исполняется подряд, но каждый из них ждет j секунд ВНУТРИ следующего! Это не то, что мне нужно (и, откровенно говоря, совершенно сбивает с толку). Что я делаю не так?

ТИА

1 Ответ

1 голос
/ 10 марта 2011

Они должны одновременно просыпаться, и они делают, когда я проверял.Мой код:

print "parent: ".localtime."\n";
for (1..3) {
    my $pid = fork();
    if ($pid == 0){
       sleep(3);
       print "$$: ".localtime."\n";
       exit(0);
    }
}

1 while wait != -1;

Unix:

parent: Wed Mar  9 22:21:27 2011
29757: Wed Mar  9 22:21:30 2011
29755: Wed Mar  9 22:21:30 2011
29756: Wed Mar  9 22:21:30 2011

Windows (эмуляция вилки):

parent: Thu Mar 10 01:19:39 2011
-3836: Thu Mar 10 01:19:42 2011
-4600: Thu Mar 10 01:19:42 2011
-4400: Thu Mar 10 01:19:42 2011

Я подозреваю, что проблема в коде, который вы не сделалипоказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...