Re: [php] прерываение по таймеру
От: kov_serg Россия  
Дата: 12.01.22 22:18
Оценка:
Здравствуйте, maks1180, Вы писали:

M>В php (консольное приложение) нужно прерывать выполнение кода регулярно, скажем 1 раз в секунду и вызывать свою функцию (OnUpdate) что-бы выводить статус.

M>Т.е. что-бы именно основной поток заходил в мою функцию, а не другой поток.
M>Можно ли указать участок коды выполнение которого нельзя прерывать ? Т.е. что-бы при заполнении струкруры данных, она либо полностью была заполнена либо ещё не тронута.
M>Как это можно сделать ?

Что мешает сделать примерно так?
<?php 

function m1($stat,$n,$batch) {
    for($i0=0;$i0<=$n;$i0+=$batch) { $t1=$i0+$batch; if ($t1>$n) $t1=$n;
        print("m1: "); for($i1=$i0;$i1<$t1;$i1++) printf(" %2d",$i1); print("\n");
        usleep(100000);
        $stat->progress=$i1/$n;
        yield;
    }
    $stat->progress=1;
    $stat->done=true;
}
function show_progress($stat) {
    printf("progress\t%5.1f%%\n",$stat->progress*100);
}
function m2($stat,$step) {
    $t1=microtime(true);
    while(!$stat->done) {
        $t2=microtime(true); $dt=$t2-$t1;
        if ($dt>=$step) { $t1=$t2; show_progress($stat); }
        yield;
    }
}

$stat=(object)[];
$stat->progress=0;
$stat->done=false;
$ma=[];
$ma[]=m2($stat,0.5);
$ma[]=m1($stat,100,7);
printf("begin\n");
while(!$stat->done) {
    foreach($ma as $m) $m->next();
}
printf("done\n");

begin
m1:   0  1  2  3  4  5  6
m1:   7  8  9 10 11 12 13
m1:  14 15 16 17 18 19 20
m1:  21 22 23 24 25 26 27
m1:  28 29 30 31 32 33 34
progress     35.0%
m1:  35 36 37 38 39 40 41
m1:  42 43 44 45 46 47 48
m1:  49 50 51 52 53 54 55
m1:  56 57 58 59 60 61 62
m1:  63 64 65 66 67 68 69
progress     70.0%
m1:  70 71 72 73 74 75 76
m1:  77 78 79 80 81 82 83
m1:  84 85 86 87 88 89 90
m1:  91 92 93 94 95 96 97
m1:  98 99
progress    100.0%
done
Отредактировано 12.01.2022 22:33 kov_serg . Предыдущая версия . Еще …
Отредактировано 12.01.2022 22:27 kov_serg . Предыдущая версия .
Отредактировано 12.01.2022 22:23 kov_serg . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.