gpt4 book ai didi

dart - Dart-使长时间运行的同步功能异步

转载 作者:行者123 更新时间:2023-12-03 02:49:10 26 4
gpt4 key购买 nike

我有一个函数,可能需要花费几秒钟来执行,并且它是同步的。是否:

String slowFunction() { ... }
...
Future<String>(() => slowFunction());

更改为异步?

如果我在下一步中需要它的结果,那么此代码有意义吗?

Future<void> anotherFunction() async {
// other async calls with Futures and await
...
final result = await Future<String>(() => slowFunction());
print(result);
...
// do something else with result
}

创建 Future只是立即在其上创建 await似乎有些奇怪。我应该只调用该函数吗?我猜这有点“屈服”,并允许其他代码之前执行,但是这样的代码有什么用吗?

最佳答案

进行本质上是同步的过程并将其打扮成异步过程是没有意义的。这是由于不仅在Dart中,而且在一般情况下,异步性(更通常称为“并发”)如何工作。并发只是一种编程技巧,它使多个操作在同一线程中相互交错运行,从而产生了真正的并行性(即不同线程或进程同时运行的地方)的错觉。这样,在程序等待其他资源进行处理时,通常会在等待资源释放之前阻塞的进程。

如果您要执行一个由于正在完成工作而导致阻塞的同步过程,则该程序将以“异步”代码的执行方式阻塞,否则程序将阻塞,但是该程序将阻塞更长的时间,但以后会阻塞。无论哪种方式,您都仍然需要长时间运行才能阻止程序。

以您要的以下示例为例:运行一个长时间运行的过程并将其包装在Future中,从而使其“异步”:

String slowFunction() { ... }
...
String result = await Future(slowFunction);

在正常的并发中,这会将 slowFunction放入异步队列中。下次程序出现一些停机时间时(例如,在两次UI绘制调用之间),它将将该函数从队列中拉出并进行处理。那就是当函数执行时它会阻塞2-3秒。

但是,在Dart中,它的工作方式略有不同。因为 slowFunction不是 async函数,并且不对 await进行任何操作,所以Dart无论如何都将尝试同步运行它,在这种情况下,您不必首先将其包装在 Future中。

如果要中断同步功能的操作,可以在此处有两个选择。您必须将其分解为可以在其之间进行 await的不同操作(它本身是一个有点复杂的过程,并不总是可能的,并且通常是很好的代码味道源),或者您可以将该函数卸载到单独的线程中完全采用并行性而不是单纯的并发。

Dart是单线程的,但可以通过使用隔离进行多进程处理。 (隔离是Dart子进程的名称,与Dart中真正的多线程十分相似。)通过将函数包装在 Isolate中,可以在完全独立的进程上运行工作。这样,如果该过程阻塞2-3秒,则完全不会影响您的应用程序的大部分。

不过有一个陷阱。由于隔离是完全不同的过程,因此不会共享任何内存。这意味着隔离区有权访问的任何数据都必须通过使用“端口”(即 SendPortReceivePort)手动传递。这自然使隔离编程有点痛苦,但是作为交换,您不会遇到诸如程序出现竞争状况或陷入僵局之类的事情。 (至少由于共享内存问题。严格来说,还有很多其他方法可以获取死锁和争用条件。)

使用 Isolate的方式如下:

// main process

void createIsolate() async {
ReceivePort isolateToMain = ReceivePort();

isolateToMain.listen((data) {
// Listen for data passed back to the main process
});

Isolate myIsolateInstance = await Isolate.spawn(myIsolate, isolateToMain.sendPort);
}

// isolate process

void myIsolate(SendPort mainToIsolate) {
final result = slowFunction();
mainToIsolate.send(result);
}

关于dart - Dart-使长时间运行的同步功能异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61737126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com