Является ли upsert thread безопасным в kdb - PullRequest
0 голосов
/ 01 марта 2020

У меня есть таблица `t на сервере (порт 5001).

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?

Ответы [ 2 ]

2 голосов
/ 01 марта 2020

Как правило, вам не нужно беспокоиться о безопасности потоков при работе с kdb (если вы не делаете некоторые сложные вещи со своим собственным C кодом, который порождает его собственные потоки или что-то в этом роде). Причина в том, что за обработку пользовательских запросов отвечает только один поток, а запросы от Client1 и Client 2 будут обрабатываться по одному.

Существует так называемый режим ввода многопоточных входных запросов (https://code.kx.com/q/kb/multithreaded-input/), но у него есть свои ограничения, что означает, что вы никогда не будете испытывать непоследовательные чтения.

1 голос
/ 01 марта 2020

Потоковая безопасность может быть принята, если действие не поточно-безопасное, kdb выдаст ошибку noupdate. В вашем случае kdb обрабатывает вызовы IP C один за другим, так что определенно существует безопасность потоков, обратное преобразование не выполняется многопоточным способом.

Несколько процессов, одновременно загружающих одну и ту же таблицу, могут быть проблемой, однако не пытайтесь это сделать.

...