[Q / KDB +]:在q中执行waitfor(等待信号或超时)

时间:2016-09-08 10:42:45

标签: kdb q-lang

Windows waitfor的q实现如何?

我有一个q进程,一次一个地将一行表的行提供给另一个进程(比如tickerplant)。

feed:{h`.u.upd,x;};
feed each tbl;

如果符合任何一个条件,我想feed下一行:

  1. 该过程从其他进程接收信号(nextready);
    1. 等待信号耗尽的时间(timeout特定于tbl的每一行,并将作为tbl
    2. 提供

      tbl视为包含当其余CEP / tickerplant准备就绪 OR 时下一个事件到期时要顺序发布的事件列表({{1}测量为最后发布的事件与下一个事件之间的增量时间跨度,即timeout),以较早者为准。

      我已尝试update timeout:((1 _deltas time),0Wp) from tbl,但while[.z.N<prevtstamp+timeout;wait()];feed x阻止了进程收听来自其他进程AFAIK的异步消息。

      考虑的其他解决方案

      检查while的信号太慢,因为.z.ts精度不能低于1ms。

      \t循环内连续轮询tickerplant的nextready)信号将减慢tickerplant的速度。

      一种解决方案是维护while当前行的i索引,将馈线分成两个进程,每个进程分别处理一个条件并轮询当前tbl索引。与i行相比,这听起来很慢。

1 个答案:

答案 0 :(得分:1)

  1. KDB是一个单线程应用程序,因此任何waitFor相似的东西都只会在while循环中发挥作用。
  2. 1ms的精度已经很高了......并且KDB不是为实时设计的。因此,如果过程正在忙于其他事情,那么即使1ms也很容易被错过。 如果你需要更高的精度..你可能需要C或甚至Driver级别的帮助来提高精度。

  3. 也许你可以考虑更好的设计来避免实时要求:)