Асинхронность не означает многопоточность. Dart работает однопоточным. Вы можете создавать изоляты для параллельного запуска кода.
Когда вы добавляете распечатку
{
//...
Timer.run(() => print('Fib1:' + fib1(41).toString()));
Timer.run(() => print('Fib2:' + fib2(41).toString()));
Timer.run(() => print('Fib3:' + fib3(41).toString()));
print('exit');
}
после ваших трех Timer.run(...
операторов вы получите представление о том, что такое async.
Закрытие, которое вы предоставляете с помощью Timer.run(...)
, планируется для более позднего выполнения, и выполняется следующий оператор вашего main. Как только цикл событий успевает обработать запланированные задачи, ваши закрытия выполняются одно за другим.
Более подробную информацию можно найти здесь: The Event Loop и Dart
** РЕДАКТИРОВАТЬ **
Когда вы запустите его таким образом, вывод может иметь для вас больше смысла
Timer.run(() => print('Fib1: ${new DateTime.now()} - result: ${fib1(41)}'));
Timer.run(() => print('Fib2: ${new DateTime.now()} - result: ${fib2(41)}'));
Timer.run(() => print('Fib3: ${new DateTime.now()} - result: ${fib3(41)}'));
print('exit');
** вывод **
exit
Fib1: 2014-01-07 12:00:46.953 - result: 165580141
Fib2: 2014-01-07 12:00:56.208 - result: 165580141
Fib3: 2014-01-07 12:00:56.210 - result: 165580141
Дело не в том, что более быстрая задача заканчивается первой. Timer.run()
планирует для последующего выполнения, и выполнение main()
продолжается. Когда цикл обработки событий возвращает управление потоком программы, он выполняет запланированные задачи одну за другой и одну за другой.
Возможно, вывод каким-то образом буферизируется окном вывода DartEditor или оболочкой и отображается партиями. Это может создать впечатление, что результаты распечатываются сразу.
** РЕДАКТИРОВАТЬ 2 **
Я только что увидел, что результаты пишутся один за другим. Легко проверить, переместите ли вы медленный Fib1
на последнюю позицию (после Fib3
)
person
Günter Zöchbauer
schedule
07.01.2014