Выполняет ли TransferManager в AWS SDK для S3 асинхронный ввод-вывод?

Я читал о TransferManager в AWS SDK Amazon для загрузки S3 предоставленный API допускает неблокирующее использование, однако мне неясно, действительно ли базовая реализация выполняет асинхронный ввод-вывод.

Я кое-что прочитал на исходный код TransferManager, и я не могу понять, блокируются ли потоки в предоставленном ExecutorService или нет.

Моя проблема в том, что если этот менеджер действительно выполняет асинхронный ввод-вывод, не блокируя этого исполнителя, то я мог бы использовать глобальный пул потоков приложения, предназначенный для вещей, связанных с ЦП. Так это на самом деле делает асинхронный ввод-вывод или нет?


person Alexandru Nedelcu    schedule 29.09.2014    source источник


Ответы (1)


После профилирования и попытки понять исходный код SDK я пришел к выводу, что да, TransferManager не работает асинхронно, потому что он использует AmazonS3Client.putObject, и такие вызовы, не блокируя потоки как таковые, идут в цикле до тех пор, пока http запросы завершены, что препятствует прогрессу в обработке очереди пула потоков.

person Alexandru Nedelcu    schedule 30.09.2014
comment
Этот пост в блоге AWS предполагает обратное: java.awsblog.com/post/Tx2Q9SGR6OKSVYX /Amazon-S3-TransferManager - person DGolberg; 30.09.2014
comment
@DGolberg нет, это не так, этот пост в блоге не утверждает обратного, и, кроме того, у меня есть доказательства после нескольких часов проверки исходного кода и выполнения профилирования. API TransferManager является неблокирующим в том смысле, что он переносит работу в настроенный пул потоков, но потоки в этом пуле потоков блокируются и, следовательно, недоступны для выполнения каких-либо других действий. Я, пожалуй, напишу об этом статью. Спасибо за минус, в этом не было необходимости. - person Alexandru Nedelcu; 30.09.2014
comment
@AlexandruNedelcu Действительно, я считаю, что вы правы, это асинхронно в том смысле, что если вы его используете, вы можете продолжать делать другие вещи в любом потоке, в котором вы сделали вызов API, но базовая реализация просто заставляет другой поток выполнять работу. Проголосуйте =D - person Richard Fung; 01.10.2014
comment
@AlexandruNedelcu Думаю, я неправильно истолковал ваш вопрос; Я прошу прощения за то. Использование диспетчера передачи в текущем потоке является асинхронным, но нет, базовые потоки не являются таковыми, как вы заявили. Мне нужно помнить, что нельзя пытаться отвечать на вопросы, когда мешает недосып... - person DGolberg; 01.10.2014
comment
@DGolberg все в порядке, я задал себе этот вопрос, потому что мне было интересно в приложении, следует ли мне использовать глобальный и ограниченный пул потоков, который приложение настроило для задач, связанных с процессором, или нет. Это было бы круто из соображений эффективности, но у нас есть пул потоков, предназначенный для блокировки операций ввода-вывода, и TransferManager по-прежнему довольно крут, потому что он может объединять несколько загрузок вместе. - person Alexandru Nedelcu; 01.10.2014
comment
Ааа, мне было любопытно узнать причину вопроса после того, как я перечитал его. Первоначально я думал, что вы беспокоитесь о том, что не сможете выполнять другую работу в основном потоке, вызывающем TransferManager; что-то, с чем я много возился и находил все более и более интересное. Я также недавно обнаружил (и исправил) много ошибок, которые я сделал ранее, в том, как я его использовал, поэтому я думаю, что у меня тоже было немного эгоизма, и я поспешил ответить, не понимая вопрос должным образом (плохо моя привычка) лол. Усталость делу не помогала. Рад, что вы смогли найти свой ответ! - person DGolberg; 01.10.2014