Будущее и асинхронное поведение не то же самое, и я не понимаю - PullRequest
2 голосов
/ 04 апреля 2019

У меня проблема с async методами и Future в Dart.

Я думаю, что сделал / понял что-то не так, но я не знаю что.

Я пытаюсь выяснить разницу между Future и async и понять, как работает цикл обработки событий.Я прочитал документацию и много статей об этом.Я подумал, что понял, и попытался написать код, который создает объект Future с вызовом sleep().

Сначала я попробовал с Future, и я думаю, что он ведет себя так, как должен:

main(List<String> arguments) {
    print('before future');
    test_future();
    print('after future');
}

test_future() {
    Future (() {
        print('Future active before 5 seconds call');
        sleep(Duration(seconds: 5));
        print('Future active after 5 seconds call');
    }).then((_) => print("Future completed"));
}

Так что это возвращает:

  1. печать до будущего
  2. создайте объект будущего, поместите его в очередь событий и немедленно верните
  3. печать после будущего
  4. вызов кода будущего из очереди событий
  5. печатьдо 5 секунд
  6. ждать 5 секунд
  7. печать через 5 секунд *
  8. печать завершена

Я думаю, все это нормально.

Теперь я пытаюсь сделать то же самое с async.Из документации добавление ключевого слова async в функцию заставляет ее немедленно возвращать Future.

Итак, я написал это:

main(List<String> arguments) {
   print('before future 2');
   test().then((_) => print("Future completed 2"));
   print('after future 2');
}

test() async {
    print('Future active before 5 seconds call');
    sleep(Duration(seconds: 5));
    print('Future active after 5 seconds call');
}

Обычно при вызове test().then(),он должен поместить содержимое test() в очередь событий и немедленно вернуть Future, но нет.Поведение таково:

  1. печать перед будущим 2
  2. вызов функции test () (должен возвращать будущее, я думаю, но код выполняется прямо сейчас)
  3. печать через 5 секунд
  4. ожидание в течение 5 секунд
  5. печать через 5 секунд
  6. печать в будущем завершена 2
  7. печать в будущем 2

Может кто-нибудь объяснить, правильно ли я использовал async или что-то не так?

Лучший

1 Ответ

2 голосов
/ 05 апреля 2019

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

await Future.delayed(const Duration(seconds: 5), (){}); 

async системные вызовы не блокируют изолят.Очередь событий все еще обрабатывается (продолжается сразу после вызова системного вызова).Если вы делаете системные вызовы синхронизации, они блокируются как сон.

Часто в dart:io системных вызовах есть варианты синхронизации и асинхронности, такие как api.dartlang.org/stable/2.2.0/dart-io/File/readAsLinesSync.html.Несмотря на то, что sleep не имеет суффикса синхронизации, он синхронизируется и не может обойтись.Вы можете использовать Future.delayed(), как показано выше, чтобы получить эффект асинхронно.

...