【问题标题】:Is upsert thread safe in kdbkdb 中的 upsert 线程安全吗
【发布时间】:2020-03-01 09:26:11
【问题描述】:

我在服务器(端口 5001)中有一个表 `t。

t:([] sym:`GOOG`AMZN; px:100 2000)

我们有两个客户端同时向表 t 插入数据。

Client 1:
h:hopen 5001
do[10; h"`t upsert ({x}rand `GOOG`AMZN;{x}rand 10)"]

Client 2:
h:hopen 5001
do[10; h"`t upsert ({x}rand `GOOG`AMZN;{x}100+rand 10)"]

根据上述情况,我有两个问题:
1. 当多个线程/进程同时更新表时,upsert线程是否安全?
2. 如果表 t 以列 sym 为键,线程行为是否相同?

【问题讨论】:

  • 我会警惕两个或更多客户将插入键控表。例如,如果他们都更新了 GOOG,那么最后处理的客户端查询将是 t 中显示的值。

标签: kdb


【解决方案1】:

在使用 kdb 时,您通常不必担心线程安全(除非您使用自己的 C 代码做一些复杂的事情,从而产生它自己的线程或其他东西)。原因是只有一个线程负责处理用户查询,来自客户端 1 和客户端 2 的查询将一次处理一个。

有一种所谓的多线程输入查询输入模式 (https://code.kx.com/q/kb/multithreaded-input/),但它有自己的限制,这意味着您永远不会遇到不一致的读取。

【讨论】:

    【解决方案2】:

    可以假设线程安全,如果一个动作不是线程安全的,kdb 将抛出一个noupdate 错误。在您的情况下,kdb 会一一处理 IPC 调用,因此绝对是线程安全的,upsert 不是以多线程方式执行的。

    同时更新插入同一个表的多个进程将是一个问题,但是不要尝试这样做。

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2020-04-15
      • 2018-07-18
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      相关资源
      最近更新 更多