NPM запускает параллельную задачу, но ждет, пока не будет доступен ресурс для запуска второй задачи

В npm, как я могу запустить две или более параллельных задачи, но ожидая, пока ресурс, который создаст первая задача, будет доступен второй задаче для его использования и так далее?

пример (концептуальный):

npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ...

Любые идеи?

ИЗМЕНИТЬ

В качестве примера: предположим, что моя первая задача запускает веб-сервер, а моя вторая задача использует данные с этого веб-сервера каждый раз, когда происходит событие. Другой пример: моей первой задачей может быть запуск webdriver-manager, моей второй задачей — запуск веб-сервера и моей третьей задачей — запускать тесты e2e каждый раз, когда мои файлы изменяются. Итак, мне нужно, чтобы все эти задачи выполнялись одновременно, но их нужно инициализировать в определенном порядке и в определенное время.


person Community    schedule 06.10.2017    source источник
comment
Это звучит как работа для обещаний!   -  person theGleep    schedule 06.10.2017
comment
Я сделал свой концептуальный пример похожим на обещания. Но встроенные сценарии npm не могут выполнять промисы, насколько мне известно.   -  person    schedule 06.10.2017
comment
Сегодня мне лучше не переполнять стек - я совершенно неправильно понял ваш вопрос и подумал, что вы спрашиваете, как это сделать в коде, а не в npm.   -  person theGleep    schedule 06.10.2017


Ответы (2)


Вы можете попробовать одновременно с wait-on для управления параллельными/последовательными сценариями и выводами. Последовательные запуски с ожиданием поддерживают состояние ответа головы, прослушивание TCP, ...

Например :

"scripts": {
    "start": "concurrently -k -n \"DB,API,WEB\" -c \"blue,magenta,yellow\" \"npm run start-db\" \"npm run start-api\" \"npm run start-web\"",
    "start-db": "myDbServerCmd",
    "start-api": "wait-on tcp:27017 && myApiServerCmd",
    "start-web": "myFrontServerCmd",
}

Спасибо dchambers за идею (источник).

person Burrich    schedule 10.01.2018

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

Возможно, вы хотите запускать задачи последовательно (первое решение ниже), однако в своем сообщении вы упомянули параллельное выполнение.


1. Запуск задач последовательно

npm-scripts поддерживает оператор &&, который обычно используется в оболочках bash. Однако оператор &&, используемый в npm-scripts, успешно работает на разных платформах.

Псевдопример использования оператора && для цепочки задач:

"scripts": {
    "foo": "npm run task1 && npm run task2 && npm run task3"
},

Запуск $ npm run foo через интерфейс командной строки, используя приведенный выше пример...

  1. Изначально работает task1.
  2. Когда task1 успешно завершит (т. е. task1 завершит работу с нулевым статусом), будет запущен task2.
  3. Когда task2 успешно завершится, будет запущен task3.

Если левая часть оператора && не работает по какой-либо причине, (т. е. завершается с ненулевым кодом/статусом), последующие задачи в правой части не запустятся. Например; если task1 выйдет из строя, task2 и task3 не запустятся.


2. Одновременный запуск задач

npm-scripts также поддерживает кросс-платформенный оператор & для одновременного выполнения задач.

Псевдопример с использованием оператора &:

"scripts": {
    "foo": "npm run task1 & npm run task2 & npm run task3"
},

В этом примере основное различие между двойным оператором && и одинарным оператором & заключается в том, что если левая часть одиночного оператора & дает сбой, то правая часть выполняется независимо. Например; если task1 терпит неудачу, то task2 продолжает работать.


3. Запуск задач параллельно.

Для параллельного запуска задач я рекомендую использовать parallelshell:

$ npm i -D parallelshell

Псевдопример с использованием parallelshell:

"scripts": {
    "foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\""
},

Сначала этот пример кажется очень похожим на использование одного оператора &, показанного в предыдущем разделе, однако он предлагает дополнительные преимущества, перечисленные в документация. Основным преимуществом (IMO) является:

Если command1 или command2 завершится с ненулевым кодом выхода, то это не повлияет на результат вашей оболочки (т.е. они могут выйти из строя, и npm/bash/что угодно проигнорирует это). parallelshell не проигнорирует его и завершит работу с первым ненулевым кодом выхода.


4. Запуск задач параллельно и последовательно.

Допустим, вы хотите запустить task1 и task2 параллельно/одновременно, а затем запустить task3 только после успешного завершения task1 и task2.

Для этого вы можете использовать как parallelshell, так и встроенный оператор &&.

Псевдопример использования parallelshell и оператора && для объединения задач:

"scripts": {
    "foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3"
},

ИЗМЕНИТЬ

Решение, основанное на следующем обновлении/редактировании OP:

Другой пример: моей первой задачей может быть запуск webdriver-manager, моей второй задачей — запуск веб-сервера и моей третьей задачей — запускать тесты e2e каждый раз, когда мои файлы изменяются. Итак, мне нужно, чтобы все эти задачи выполнялись одновременно, но их нужно инициализировать в определенном порядке и в определенное время.

5. Запуск задач одновременно.

concurrently можно использовать для одновременного выполнения задач:

$ npm i -D concurrently

Псевдопример с использованием concurrently:

"scripts": {
    "foo":  "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\""
},

В этом примере все задачи (1,2 и 3) будут выполняться одновременно, и они будут запускаться в указанном порядке. Я не знаю достаточно подробностей об инструментах, упомянутых в вашем примере использования, однако все примеры, представленные в этом посте, могут быть объединены по мере необходимости для удовлетворения ваших конкретных требований.

concurrently также имеет несколько полезных параметров.

person RobC    schedule 07.10.2017
comment
На самом деле, ни один из них не удовлетворяет мою потребность. Я отредактировал сообщение с двумя примерами для лучшего понимания. - person ; 07.10.2017
comment
твой ответ в любом случае великолепен. Я проголосовал за вас в знак благодарности - person ; 07.10.2017
comment
Спасибо, Андре. На основе примера использования, приведенного в вашем редактировании, concurrently, вероятно, то, что вы находясь в поиске? См. обновленный/отредактированный ответ. - person RobC; 07.10.2017
comment
одновременно не будет ждать, пока будет доступен ресурс одной задачи, поэтому на самом деле не тот ответ, который мне нужен :( - person ; 10.10.2017
comment
К вашему сведению, stackoverflow.com/a/58782760/539472 Убедитесь, что вы используете версию parallelshell 3.0.1, чтобы избежать указаний в ссылке . - person Chaitanya; 14.04.2020