Попытка вычислить реальную задержку между выполнениями функции InvokeAfter.

Функция должна срабатывать пять раз в секунду

index  delay now
0      0     18:47:33
1      0     18:47:33
2      0     18:47:33
3      0     18:47:33
4      0     18:47:33
5      1     18:47:34
6      1     18:47:34
7      1     18:47:34
8      1     18:47:34
9      1     18:47:34
10     2     18:47:35
11     2     18:47:35
12     2     18:47:35
13     2     18:47:35
14     2     18:47:35
...




Но я понимаю это

enter image description here

Столбец real_delay - это разница между этой строкой и предыдущей.


КОД

let
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each Number.IntegerDivide([Column1], 5)),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(
        ()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))
    ),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay




Что не так с кодом? Или, может быть, с функцией InvokeAfter ???


0
Sergey Lossev 20 Фев 2016 в 19:45

2 ответа

Лучший ответ

5 раз в секунду означает, что вы должны ждать (секунда / 5) = 0,2 долей секунды на каждый вызов.

Если вы запустите этот код:

let
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each 0.2),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(
        ()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))
    ),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay

Вы увидите, что функция вызывалась примерно 5 раз в секунду.

0
Carl Walsh 21 Фев 2016 в 22:08

== РЕШЕНИЕ ==



enter image description here

НОВЫЙ КОД

let
    threads=5,
    t = Table.FromList({0..19}, Splitter.SplitByNothing()),
    delay = Table.AddColumn(t, "delay", each if Number.Mod([Column1], threads)=0 and [Column1]>0 then 1 else 0),
    InvokeAfter = Table.AddColumn(delay, "InvokeTimeNow", each Function.InvokeAfter(()=>DateTime.Time(DateTime.LocalNow()), #duration(0,0,0,[delay]))),
    real_delay = Table.AddColumn(InvokeAfter, "real_delay", each try InvokeAfter{[Column1=[Column1]-1]}[InvokeTimeNow]-[InvokeTimeNow] otherwise "-")
in
    real_delay

Первоначальной идеей был многопоточный парсинг. А поскольку для одновременных подключений были некоторые ограничения, пришлось адаптироваться.

Я думал, что есть момент "ноль-ноль-старт", после которого вызывается функция - момент, когда вычисляется ячейка (все ячейки почти одновременно). Второй параметр означает задержку после этой точки старта. Но, похоже, накапливает все задержки. Очень странное поведение, имхо ...

Вот и решил проблему, но до сих пор не понимаю почему =)

0
Sergey Lossev 22 Фев 2016 в 18:45