python - 在Elasticsearch文档线程中更新数组是否安全?

标签 python elasticsearch concurrency

我有一个文档,其中包含一个字符串数组作为其属性之一。

在某些情况下,会从两个线程对索引执行多个更新查询,并且有可能更新同一文档。

例如,给定一个文档,其中my_array的值为:

my_array = [1,2,3,4]

这两个线程执行以下更新查询,该查询在具有不同参数的索引上运行无痛脚本。

线程_0-> my_item = 3

线程_1-> my_item = 2
int index_of_my_item = ctx._source.my_array.indexOf(params.my_item);

if (-1 != index_of_my_item) {
    ctx._source.my_array.remove(index_of_item);                    
}   

执行线程安全吗?该文档中的属性值为:
my_array = [1,4]

还是有种族条件要考虑?

谢谢,

最佳答案

ES在乐观并发控制上工作,并且它使用版本号来实现这一点,因此没有线程安全的概念(从ES Angular 来看)。

只需浏览这些链接,它将使您很清楚,对于ES来说确切的更新意味着什么

https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html
https://www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control.html

使用索引API更新文档时,我们会读取原始文档,进行更改,然后一次性为整个文档重新编制索引。最近的索引请求胜出:上一个索引的文件是存储在Elasticsearch中的文件。如果其他人同时更改了文档,则他们的更改将丢失。

关于python - 在Elasticsearch文档线程中更新数组是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54465210/

相关文章:

python - 检查两个 python 函数(或方法)的兼容性

java - 嵌入式 Elasticsearch junit web 服务测试

elasticsearch - Storm 搜寻器搜寻和索引

ios - 在 iOS 6 上第二次未设置值。线程问题?

Python:unittest,AttributeError 尝试从测试类的 __init__ 访问自身属性

python - Redis在results_ttl=0的时候还是会填满,为什么?

geolocation - ElasticSearch 脚本字段返回不正确的经度值

c++ - 队列(多个生产者和消费者)的并发访问问题 - C++,Boost

java - 非阻塞同步器?

python - 循环遍历每一行值并返回列名称