什么时候使用异步计算?

When to use asynchronous computation?

我在异步计算中遇到了以下示例:

//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() 都应该是耗时的步骤,否则并行化没有意义。对吗?

如果我的理解有误,请纠正我,我们通过计算中的异步步骤实现了更多目标。

您还可以介绍一个使用异步计算的最常见用例吗?

是的,基本上您使用异步计算来处理应该 运行 与其他任务并行的耗时任务,例如ui 个线程。 "time consuming" 的意思是一个定义问题,即在某些系统中它可能意味着 "longer than a few ms".

例如,某些 "time consuming" 任务可能会阻止您的 ui 顶部更新,因此您可以 运行 异步执行该任务,即与 ui 更新并行(例如,在 Swing 中,这意味着使用 worker 而不是在事件调度线程中执行这些任务)。

数据的可用性只是使用异步计算还是同步计算的次要指标。您可以推迟任务的执行,直到 required 数据可用(例如通过使用 Future 或消息),同时仍然进行其他计算(例如 ui 更新)。

也就是说,您应该仔细考虑如何为任务建模以减少开销(太多或太小的任务实际上可能会降低性能,不必要地阻塞 CPU 时间等资源)。如果数据的可用性本质上意味着同步计算,那么这可能就是可行的方法。但是,您仍然可以有多个 asynchonous/parallel 进程,每个进程同步执行自己的任务。