2017-02-07 7 views
0

Я пытаюсь понять, как Node решает, что запускать асинхронно (параллельно) и что запускать синхронно (последовательно).Являются ли эти утверждения gulp выполняться параллельно или последовательно в узле?

Исходя из синхронного фона JavaScript, я бы ожидал, что первый оператор, указанный ниже, будет запущен первым, а затем только после его завершения узел попытается запустить второй оператор.

Я согласен с этим, пожалуйста?

// first statement 
gulp.src('src/test-1.txt') 
    .pipe(gulp.dest('dest/')); 

// second statement 
gulp.src('src/test-2.txt') 
    .pipe(gulp.dest('dest/')); 
+0

Async не означает параллель (многопоточные потоки/процессы, выполняемые одновременно). Это просто означает, что выселение происходит асинхронно. Потоки, используемые для копирования, делят данные, которые обрабатываются на небольшие куски, поэтому в вашем примере копирование может быть _interleaved_. –

ответ

0

Да и №

Первого утверждение всегда выполняются и завершаются до начала второго оператора. Это всегда верно, как и большинство языков программирования.

Однако цель/задача (копия 'src/test-1.txt' в 'dest /') первого оператора не требуется завершить до цели/задачи второго оператора (copy 'src/test- 2.txt 'to' dest/').

Возможно, сначала скопировано test-1.txt, затем test-2.txt или наоборот. Это зависит от времени выполнения, ОС, файловой системы, размера файла и т. Д.

Также асинхронно не имеет ничего общего с параллелизмом. Выполнение кода асинхронно означает, что вы ставите задачи в очередь и yo не ждите, пока они не закончатся до завершения инструкции (например, setTimeout). Задачи могут выполняться в серийном или параллельном режиме (чаще всего в серийном для JS).

Если вы выполняете синхронно, это означает, что вы дождались завершения задачи до завершения инструкции.

Параллелизм означает, что вы выполняете задачи одновременно (т. Е. С потоками).

+0

Я вижу. Таким образом, код выполняет одну строку за другой (как и ожидалось), но результат каждого выполнения может вернуться в другое время. Поэтому, если бы я хотел убедиться, что второй оператор работает только после того, как первый оператор будет полностью завершен, мне нужно будет реализовать некоторую форму runback/series runner. –

+0

Да. Но прежде чем реализовать свой собственный серийный бегун, сначала проверьте существующую библиотеку. –

+0

Да, я видел одну или две библиотеки, которые могут помочь в этом отношении. У меня есть последующий запрос, но я не уверен, должен ли я использовать этот комментарий, чтобы спросить его, но на всякий случай: say У меня есть функция который читает два текстовых файла и возвращает два файла, объединенные вместе. Возможно ли, что возвращенный результат мог выполнить до того, как один из файлов будет прочитан из файловой системы, что означает, что результат будет содержать только один файл, а не два, или Узел достаточно умный, чтобы знать, что все операторы внутри функции должны быть заполнены перед возвратом результат? –

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

  • Нет связанных вопросов^_^