Сообщение Re: [php] прерываение по таймеру от 12.01.2022 22:18
Изменено 12.01.2022 22:27 kov_serg
Re: [php] прерываение по таймеру
Здравствуйте, maks1180, Вы писали:
M>В php (консольное приложение) нужно прерывать выполнение кода регулярно, скажем 1 раз в секунду и вызывать свою функцию (OnUpdate) что-бы выводить статус.
M>Т.е. что-бы именно основной поток заходил в мою функцию, а не другой поток.
M>Можно ли указать участок коды выполнение которого нельзя прерывать ? Т.е. что-бы при заполнении струкруры данных, она либо полностью была заполнена либо ещё не тронута.
M>Как это можно сделать ?
Что мешает сделать примерно так?
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) {
$t1=microtime(true);
while(!$stat->done) {
$t2=microtime(true); $dt=$t2-$t1;
if ($dt>=0.5) { $t1=$t2; show_progress($stat); }
yield;
}
}
$stat=(object)[];
$stat->done=false;
$ma=[];
$ma[]=m1($stat,100,7);
$ma[]=m2($stat);
printf("begin\n");
for($stat->done=false;!$stat->done;) {
foreach($ma as $m) $m->next();
}
show_progress($stat);
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
m1: 35 36 37 38 39 40 41
m1: 42 43 44 45 46 47 48
progress 49.0%
m1: 49 50 51 52 53 54 55
m1: 56 57 58 59 60 61 62
m1: 63 64 65 66 67 68 69
m1: 70 71 72 73 74 75 76
m1: 77 78 79 80 81 82 83
progress 84.0%
m1: 84 85 86 87 88 89 90
m1: 91 92 93 94 95 96 97
m1: 98 99
progress 100.0%
done
Re: [php] прерываение по таймеру
Здравствуйте, maks1180, Вы писали:
M>В php (консольное приложение) нужно прерывать выполнение кода регулярно, скажем 1 раз в секунду и вызывать свою функцию (OnUpdate) что-бы выводить статус.
M>Т.е. что-бы именно основной поток заходил в мою функцию, а не другой поток.
M>Можно ли указать участок коды выполнение которого нельзя прерывать ? Т.е. что-бы при заполнении струкруры данных, она либо полностью была заполнена либо ещё не тронута.
M>Как это можно сделать ?
Что мешает сделать примерно так?
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");
for($stat->done=false;!$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