我使用Segment
和TotalSegments
参数将DynamoDB扫描分割为多个工作人员(如开发人员指南的Parallel Scan section所示)。
但是,所有结果都会返回给一个工作人员。这可能是什么问题?我是如何实施线程的?
import threading
import boto3
def scan_foo_table(foo, segment, total_segments):
print 'Looking at segment ' + str(segment)
session = boto3.session.Session()
dynamoDbClient = session.client('dynamodb')
response = dynamoDbClient.scan(
TableName='FooTable',
FilterExpression='bar=:bar',
ExpressionAttributeValues={
':bar': {'S': bar}
},
Segment=segment,
TotalSegments=total_segments,
)
print 'Segment ' + str(segment) + ' returned ' + str(len(response['Items'])) + ' items'
def create_threads(bar):
thread_list = []
total_threads = 3
for i in range(total_threads):
# Instantiate and store the thread
thread = threading.Thread(target=scan_foo_table, args=(bar, i, total_threads))
thread_list.append(thread)
# Start threads
for thread in thread_list:
thread.start()
# Block main thread until all threads are finished
for thread in thread_list:
thread.join()
def lambda_handler(event, context):
create_threads('123')
输出:
Looking at segment 0
Looking at segment 1
Looking at segment 2
Segment 1 returned 0 items
Segment 2 returned 0 items
Segment 0 returned 10000 items
答案 0 :(得分:0)
向我跳过的一件事是过滤器表达式。
与您的过滤器表达式匹配的项可能位于第一个段中。
值得注意的是,并行扫描不会拆分项目,但会拆分搜索项目的密钥空间。可以把它想象成将一条非常大的高速公路分成多个车道。有可能的是,大多数汽车都在快车道上,你不会在其他车道上看到任何车辆。
虽然在这种情况下,过滤器表达式似乎更有可能只导致一个段返回项目。
答案 1 :(得分:-1)
您正在创建DynamoDB会话和客户端,并在所有线程之间共享。如果你看一下这个例子,他们就不会这样做。尝试创建会话和客户端,以便每个线程都有自己的,这个问题可能会消失。