2015-01-07 2 views
0

я кулачок через ниже примера асинхронного computatiton:Когда использовать асинхронное вычисление?

//Create an Asynchronous channel. No connection has actually been established yet 
AsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open(); 

/**Connect to an actual server on the given port and address. 
    The operation returns a type of Future, the basis of the all asynchronous operations in java. In this case, a Void is returned because nothing is returned after a successful socket connection 
    */ 
Void connect = asynchronousSocketChannel.connect(new InetSocketAddress("127.0.0.1", 5000)).get(); 


//Allocate data structures to use to communicate over the wire 
ByteBuffer helloBuffer = ByteBuffer.wrap("Hello !".getBytes()); 

//Send the message 

Future<Integer> successfullyWritten= asynchronousSocketChannel.write(helloBuffer); 

    //Do some stuff here. The point here is that asynchronousSocketChannel.write() returns almost immediately, not waiting to actually finish writing the hello to the channel before returning control to the currently executing thread 

doSomethingElse(); 

//now you can come back and check if it was all written (or not) 

System.out.println("Bytes written "+successfullyWritten.get()); 

Я новичок в асинхронные вычисления. Но то, что я понимаю из приведенного вами примера, заключается в том, что целая цель делать асинхронно - это распараллеливать операции. Как и в случае, когда мы делали вещи синхронно write() и doSomethingElse(), случалось бы серийно. Поэтому важными свойствами выбора асинхронных вычислений являются:

1) doSomethingElse() не должен зависеть от вывода write().

2) write() и doSomethingElse() оба должны занимать много времени, иначе нет распараллеливания. Правильно?

Пожалуйста, исправьте меня в случае, если мое понимание неверно, и есть нечто большее, что мы достигаем за счет асинхронных шагов в вычислении.

Также вы можете представить наиболее распространенный вариант использования асинхронных вычислений.

+0

Uh, асинхронный ввод-вывод и асинхронные вычисления не обязательно соединяются вместе ... – fge

+1

Да, вы, кажется, повесили его, потому что канал асинхронен, вы можете что-то сделать, когда он пишет данные, то, что вы делаете, тем временем не должно полагаться на результат асинхронной задачи, и, действительно, если это не занимает много времени, вы просто добавляете ненужные накладные расходы. – FrederikDS

ответ

2

Да, в основном вы используете асинхронное вычисление для трудоемких задач, которые должны выполняться параллельно с другими задачами, например. ui темы. Что означает «время», это вопрос определения, хотя, например, в некоторых системах это может означать «дольше нескольких мс».

В качестве примера, некоторая «трудоемкая» задача может блокировать обновление вашего ui, чтобы вы выполняли эту задачу асинхронно, то есть параллельно с обновлениями ui (например, в Swing это означало бы использование рабочих вместо выполнения этих задач в случае отправки потока).

Доступность данных является лишь незначительным показателем того, следует ли использовать асинхронные или синхронные вычисления. Вы можете отложить выполнение заданий до тех пор, пока не будут доступны требуемые данные (например, с помощью Future или сообщений), и все же выполнять другие вычисления за это время (например, обновления ui).

Это говорит о том, что вы должны тщательно подумать о том, как вы моделируете свои задачи, чтобы уменьшить накладные расходы (слишком много или слишком маленькие задачи могут фактически снизить производительность, излишне блокировать ресурсы, такие как время процессора и т. Д.). Если доступность данных по существу предполагает синхронные вычисления, то это может быть способ пойти. Как бы то ни было, у вас все еще может быть несколько асинхронных/параллельных процессов, каждый из которых выполняет свои собственные задачи синхронно.

+0

У меня есть еще одно сомнение и объяснение. Я приведу два сценария: – abhishek08aug

+0

1) У меня есть 10 файлов для копирования на файловый сервер, за что я делаю 10 асинхронных вызовов, каждый из которых копирует один файл на файловый сервер, и я получаю 10 будущих объектов на что я могу сделать get(), чтобы узнать, были ли задания успешными или нет. И если для копирования одного файла требуется 10 минут, асинхронный стиль, я бы смог скопировать все 10 файлов за 10 минут (игнорируя ограничения сети и т. Д.). Так что это хороший прецедент для использования асинхронных вычислений. – abhishek08aug

+0

2) Теперь у меня есть только один файл, поэтому не имеет значения, если я иду асинхронным стилем или синхронным стилем, так как мне все равно придется ждать 10 минут, и я не сохраняю ни одного времени, поэтому я бы сказал, синхронно. – abhishek08aug

Смежные вопросы