【发布时间】:2016-02-06 10:19:25
【问题描述】:
免责声明:我知道这个问题会惹恼一些人,因为它是模糊的、理论上的,而且代码很少。
我在 Python 中有一个 AWS Lambda 函数,它从 S3 读取非规范化记录文件,正确格式化其内容,然后通过批量写入将其上传到 DynamoDB。这一切都像宣传的那样工作。然后,我尝试将此管道的上传部分分解为线程,以期更有效地利用 DynamoDB 的写入容量。但是,多线程版本慢了大约 50%。由于代码很长,我已经包含了伪代码。
NUM_THREADS = 4
for every line in the file:
Add line to list of lines
if we've read enough lines for a single thread:
Create thread that uploads list of lines
thread.start()
clear list of lines.
for every thread started:
thread.join()
到目前为止我检查过的问题的重要说明和可能的来源:
- 在使用 DynamoDB Local 进行本地测试时,线程确实让我的程序运行得更快。
- 如果我只使用 1 个线程,或者即使我使用多个线程但我在启动后立即加入线程(实际上是单线程),程序完成得更快。 1个线程~30s,多线程~45s。
- 我在线程之间没有共享内存,没有锁等。
- 我尝试为每个线程创建新的 DynamoDB 连接并改为共享一个连接,但没有任何效果。
- 我已经确认,添加更多线程不会超过 DynamoDB 的写入容量,因为它会发出相同数量的批量写入请求,并且在整个执行过程中我没有比使用单个线程更多的未处理项目。
- 线程应该改进执行时间,因为程序是网络绑定的,即使 Python 线程并不真正在多个内核上运行。
- 我曾尝试先读取整个文件,然后生成所有线程,认为最好不要中断磁盘 IO,但没有效果。
- Thread 库和 Process 库我都试过了。
我再次知道这个问题是非常理论化的,所以可能很难看出问题的根源,但是否有一些我不知道的 Lambda 怪癖?还有什么我可以尝试帮助诊断问题的吗?任何帮助表示赞赏。
【问题讨论】:
标签: python multithreading amazon-web-services amazon-dynamodb aws-lambda