2014-02-02 3 views
2

Я изучаю будущее Дарта и прочитал несколько статей о Future.Правильно ли я понимаю будущее Дарта?

В нем говорится, что Дарт является однопоточным, и мы можем использовать Future, чтобы выполнить некоторые дорогие функции позже, например. чтение файлов.

Предпочитаете читать файл будет стоить 10 секунд, и у меня есть 3 файла для чтения.

Мой дротик Код:

main() { 
    readFile("aaa.txt"); 
    readFile("bbb.txt"); 
    readFile("ccc.txt"); 
    print("Will print the content of the files later"); 
} 

readFile(String filename) { 
    File file = new File(filename); 
    file.readAsString().then((content) { 
    print("File content:\n"); 
    print(content); 
    }); 
} 

Поскольку чтение файла будет стоить 10 секунд, так что приведенный выше код будет стоить не менее 30 секунд, не так ли? Использование фьючерсов для чтения файлов просто для того, чтобы дорогостоящие задачи выполнялись позже один за другим, без блокировки текущего кода, но не снизили общую стоимость?

Если в java я могу создать пул потоков и выполнить 3 будущие задачи, выполняемые параллельно, общая стоимость будет составлять от 10 до 20 секунд.

Можно ли сделать то же самое в Дарте? Использует ли изоляция Dart единственное решение?

ответ

3

Я бы ожидал, что этот мог бы занять 10 секунд, так как он запустит три чтения, каждый из которых поставит очередь на обратный вызов функции «then», когда чтение будет завершено. Вполне возможно, что три файла будут загружаться параллельно и все будет завершено через 10 секунд. Однако обратные вызовы будут вызываться в основном потоке последовательно.

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

2

Это правильно. Если вы начнете новый путь асинхронизации с new Timer(), new Future() или scheduleMicrotask(), он будет назначен для последующего исполнения.

Когда один из ваших асинхронных путей ждет сетевой запрос или файловая система, возвращающая данные, другой путь async может заходить и запускаться тем временем. Таким образом, вы можете получить время работы менее 30 секунд, но вы не можете сократить время выполнения, добавив процессор. Должен признать, что я не знаю подробностей о том, когда происходит планирование и как это работает.

Dart не имеет нитей, поэтому, если вы хотите запускать код параллельно, вам нужны изоляты.

+0

Я сомневаюсь в этом «Когда один из ваших асинхронных путей ждет сетевой запрос или файловая система, возвращающая данные, другой путь async может заходить и запускаться в то же время». Есть ли в нем статья/документ/код? Я думал, что если одна задача не будет завершена, другая задача не будет работать, даже если она ждет IO – Freewind

+0

Если вы вызываете функцию API, которая имеет обратный вызов (http-запрос или доступ к файлам, ...), вы зарегистрируйте обработчик для обратного вызова и закончите путь, который возвращает элемент управления в цикл событий, и начнется следующая задача. Ваш путь начинается снова, когда происходит обратный вызов. Это понимание, которое я имею - может быть, конечно, неправильно. Должно быть похоже на совместную многозадачность. –

+0

Я еще не нашел документы об этом. –

Смежные вопросы