PQ - Function.InvokeAfter() - 实际延迟

时间:2016-02-20 16:45:40

标签: powerbi powerquery

尝试计算InvokeAfter-function执行之间的实际延迟。

功能应该每秒发射五次

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 是此行与上一行之间的差异


CODE

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-function ???


2 个答案:

答案 0 :(得分:0)

每秒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次。

答案 1 :(得分:0)

<小时/>

== SOLUTION ==

<小时/> <小时/> 这是我自己的解决方案。令人惊讶的是,我认为......

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

最初的想法是多线程解析。由于同时连接有一些限制,我不得不适应。

我认为有一个“零 - 零开始”时刻,之后调用函数 - 计算单元格的时刻(所有单元格几乎同时)。第二个参数表示此起点后的延迟。但它似乎累积了所有延迟。非常奇怪的行为,imho ...

所以我解决了这个问题,但仍然不明白为什么=)