计算循环内的确切睡眠时间


Calculate exact sleep time inside loop

我正在尝试以升序计算循环的精确循环时间。

这是我尝试过的…

$tasks = array(
    array(
        'halt' => 5,
        'task' => 'first'
    ),
    array(
        'halt' => 10,
        'task' => 'second'
    ),
    array(
        'halt' => 15,
        'task' => 'third'
    ),
);
$halt_time = 0;
foreach($tasks as $task){
    $halt_time = $halt_time > 0 ? $task['halt'] - $halt_time : $halt_time + $task['halt'];
    if ($halt_time > 0) sleep($halt_time);
}

这个工作,它根据正确的时间运行循环,但当暂停时间相同时失败,例如,它不会正确工作以下数组…

$tasks = array(
    array(
        'halt' => 5,
        'task' => 'first'
    ),
    array(
        'halt' => 5,
        'task' => 'second'
    ),
    array(
        'halt' => 5,
        'task' => 'third'
    ),
);

在这种情况下,它应该在第一个任务之前只等待5秒,然后运行每个任务。

我想解释一下-如果它在前一个任务中已经睡了5秒,那么它不应该在第二个任务中睡15秒,所以- sleep(5)为第一个任务,sleep(10)为第二个任务。

计算公式中缺少什么?请建议。由于

如果您只计算等待的秒数,然后也检查此值会怎么样?简短但未经测试的代码。

$halt_time       = 0;
$total_wait_time = 0;
foreach ($tasks as $task) {
    print_r(sprintf("starting %6s task at %s", $task['task'], date("H:i:s")));
    $halt_time = $task['halt'];
    if ($total_wait_time <= $halt_time) {
        $halt_time = $halt_time - $total_wait_time;
    }
    if ($halt_time > 0 || $total_wait_time === 0) {
        sleep($halt_time);
        $total_wait_time += $halt_time;
    }
    print_r(sprintf(", finished at %s'n", date("H:i:s")));
}

对于第一个数组,输出是:

starting  first task at 19:29:28, finished at 19:29:33
starting second task at 19:29:33, finished at 19:29:38
starting  third task at 19:29:38, finished at 19:29:43

第二个:

starting  first task at 19:30:58, finished at 19:31:03
starting second task at 19:31:03, finished at 19:31:03
starting  third task at 19:31:03, finished at 19:31:03

希望这是你需要的,如果不是,我误解了你的问题。

所有代码未经测试。; -/

这是关于'halt' ($delayHalt)值的两个单独使用:

1)它可以是一个"总累积等待时间",即如果它大于到目前为止的总执行时间($delayTotal),那么延迟使到目前为止的总执行时间等于$delayHalt时间。

2)可以将此任务延迟为。

我们如何识别它们?

  • 我们保留到目前为止延迟的运行总数($delayTotal)

  • 我们检查当前的Halt ($delayHalt)值:

如果大于$delayTotal,则:

  • $delaySleep = - $delayHalt - $delayTotal;

否则我们将其视为延迟睡眠

  • $delaySleep = $delayHalt

我们总是将$delaySleep添加到$delayTotal

我们然后sleep($delaySleep);

它应该做需要做的事。

示例代码:

$delayTotal = 0;
$delayHalt  = 0;
$delaySleep = 0;
$halt_time = 0;
foreach($tasks as $task){
    print_r(date('H:i:s')); 
    $delayHalt = $task['halt'];
    $delaySleep = $delayHalt; // default
    if ($delayHalt > $delayTotal) { // calculate difference
        $delaySleep = $delayHalt - $delayTotal ;
    }
    $delayTotal += $delaySleep; // total nap time
    sleep($delaySleep); // snooze
    print_r(date('H:i:s'));   
}