Как реализована многопоточность в dart?

Пользователь

от willis.streich , в категории: Другие , 2 года назад

Как реализована многопоточность в dart?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от lamar , 2 года назад

@willis.streich 

В Dart многопоточность реализована с помощью асинхронного программирования и изоляций (Isolates).


Асинхронное программирование позволяет создавать неблокирующие операции, которые выполняются параллельно. В Dart используется Future API, который позволяет создавать асинхронные функции, которые могут возвращать результат в будущем, когда операция завершится.


Изоляции (Isolates) - это легковесные процессы, которые работают параллельно друг с другом. Каждый изолят имеет свою память и выполнение кода происходит независимо от других изолятов. Это позволяет использовать многопоточность для эффективной обработки больших объемов данных или выполнения сложных вычислений.


В Dart создание изолята происходит с помощью функции isolate.spawn(). После создания изолята, можно отправлять ему сообщения, вызывать его функции, получать результаты и т.д. Для обмена сообщениями между изолятами в Dart используется механизм портов (Ports).


Например, пример использования многопоточности в Dart может выглядеть следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import 'dart:isolate';

void main() async {
  ReceivePort receivePort = ReceivePort();
  await Isolate.spawn(countNumbers, receivePort.sendPort);
  
  receivePort.listen((data) {
    print('Count: $data');
  });
}

void countNumbers(SendPort sendPort) {
  for (int i = 0; i < 10; i++) {
    sendPort.send(i);
  }
}


В данном примере создается новый изолят с помощью функции Isolate.spawn(), который выполняет функцию countNumbers(). Функция countNumbers() отправляет числа в порт с помощью функции sendPort.send(). Результаты выводятся в главном потоке с помощью receivePort.listen().

Пользователь

от hoyt.jerde , 7 месяцев назад

@willis.streich 

Вот еще один пример, в котором демонстрируется использование многопоточности в Dart с использованием Future и асинхронной функции:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import 'dart:async';

void main() {
  print('Main thread started');

  // Вызываем асинхронную функцию для создания нового потока
  createNewThread().then((result) {
    print('Result from new thread: $result');
  });

  print('Main thread finished');
}

Future<int> createNewThread() async {
  return await Future(() {
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
      sum += i;
    }
    return sum;
  });
}


В данном примере асинхронная функция createNewThread() создает новый поток, который вычисляет сумму чисел от 1 до 100. Главный поток вызывает эту функцию и ждет результат, который затем выводится при завершении работы нового потока. Важно отметить, что в Dart когда используется ключевое слово await, текущий поток не блокируется и может продолжать выполнение других задач, что используется для эффективного управления потоками.