问题 AWS SDK for S3中的TransferManager是否正在执行异步I / O?


我一直在读 TransferManager 在用于执行S3上传的亚马逊AWS SDK中,提供的API允许非阻塞使用,但是我不清楚底层实现是否实际执行异步I / O.

我做了一些阅读 TransferManager的源代码 我无法理解是否提供了线程 ExecutorService 被封锁与否。

我的问题是,如果这个管理器实际上在不阻塞执行器的情况下进行异步I / O,那么我可以使用应用程序的全局线程池,这是用于CPU绑定的东西。那么这实际上是在做异步I / O吗?


1572
2017-09-29 19:25


起源



答案:


在剖析并试图理解SDK的源代码之后,我得出的结论是, TransferManager 不会异步工作,因为它背负着 AmazonS3Client.putObject 这些调用虽然没有阻塞线程本身,但是在http请求完成之前进入循环,从而阻止了处理线程池队列的进程。


11
2017-09-30 06:50



AWS博客上的这篇文章另有说明: java.awsblog.com/post/Tx2Q9SGR6OKSVYX/Amazon-S3-TransferManager - DGolberg
@DGolberg不,不是,博客文章没有声明,除了我在几个小时检查源代码和进行分析后得到证据。 TransferManager的API是非阻塞的,因为它将工作卸载到已配置的线程池,但该线程池中的线程阻塞,因此无法执行任何其他操作。我可能会写一篇关于它的文章。谢谢你的投票,没有必要。 - Alexandru Nedelcu
@AlexandruNedelcu确实我相信你是正确的,它是异步的,如果你使用它,那么你可以继续在你调用API的任何线程中做其他事情,但底层实现只是让另一个线程来完成工作。有一个upvote = D. - Richard Fung
@AlexandruNedelcu我想我错误地解释了你的问题;我为此道歉。在当前线程上使用传输管理器是异步的,但不是,正如您所说的那样,底层线程不是。我需要记住在睡眠不足的情况下停止尝试回答问题...... - DGolberg
@DGolberg没关系,我问自己这个问题,因为我在一个应用程序中想知道我是否应该使用应用程序为CPU绑定任务配置的全局和有限的线程池。出于效率原因,这本来很酷,但我们有一个用于阻止I / O内容的线程池,而TransferManager仍然很酷,因为它可以批量多次上传。 - Alexandru Nedelcu


答案:


在剖析并试图理解SDK的源代码之后,我得出的结论是, TransferManager 不会异步工作,因为它背负着 AmazonS3Client.putObject 这些调用虽然没有阻塞线程本身,但是在http请求完成之前进入循环,从而阻止了处理线程池队列的进程。


11
2017-09-30 06:50



AWS博客上的这篇文章另有说明: java.awsblog.com/post/Tx2Q9SGR6OKSVYX/Amazon-S3-TransferManager - DGolberg
@DGolberg不,不是,博客文章没有声明,除了我在几个小时检查源代码和进行分析后得到证据。 TransferManager的API是非阻塞的,因为它将工作卸载到已配置的线程池,但该线程池中的线程阻塞,因此无法执行任何其他操作。我可能会写一篇关于它的文章。谢谢你的投票,没有必要。 - Alexandru Nedelcu
@AlexandruNedelcu确实我相信你是正确的,它是异步的,如果你使用它,那么你可以继续在你调用API的任何线程中做其他事情,但底层实现只是让另一个线程来完成工作。有一个upvote = D. - Richard Fung
@AlexandruNedelcu我想我错误地解释了你的问题;我为此道歉。在当前线程上使用传输管理器是异步的,但不是,正如您所说的那样,底层线程不是。我需要记住在睡眠不足的情况下停止尝试回答问题...... - DGolberg
@DGolberg没关系,我问自己这个问题,因为我在一个应用程序中想知道我是否应该使用应用程序为CPU绑定任务配置的全局和有限的线程池。出于效率原因,这本来很酷,但我们有一个用于阻止I / O内容的线程池,而TransferManager仍然很酷,因为它可以批量多次上传。 - Alexandru Nedelcu