Як використовувати можливості одночасного виконання Drush?


9

Я використовую кілька сайтів Drupal (одна кодова база, кілька сайтів / *). Поряд з цим я почав використовувати псевдоніми Drush для управління ними:

$ cat sites/all/drush/aliases.drushrc.php
<?php
$aliases['localdev'] = array(
  'site-list' => array(
    'site1', 
    'site2',
    'site3',
  ),
);
?>

Це дозволяє мені легко виконувати дії на всіх сайтах:

$ drush @localdev cc all

>> Я також нещодавно виявив, що я можу просто використовувати @sites і відмовитись від файла drushrc .

Виконуючи це, виконуватимуться "cc all" на кожному з моїх сайтів послідовно (по одному).

Я хотів би перенести це на наступний рівень і спробувати запустити ці команди на всіх сайтах одночасно . Я робив деякий читання, і знаходяться під враженням , що Drush це дійсно підтримує це. Функція drush_invoke_process () приймає $ backend_options, яка може містити (з документації на функції):

 *      'invoke-multiple'
 *        If $site_alias_record represents a single site, then 'invoke-multiple'
 *        will cause the _same_ command with the _same_ arguments and options
 *        to be invoked concurrently (e.g. for running concurrent batch processes).
 *      'concurrency'
 *        Limits the number of concurrent processes that will run at the same time.
 *        Defaults to '4'.

Однак я не можу зрозуміти, як я використовую це в командному рядку Drush . Чи є варіант, який мені потрібно передати Drush, чи мені потрібно щось встановити у файлі налаштувань?

Будь-яка інформація буде дуже вдячна - моя цікавість пікантна!

ОНОВЛЕННЯ

На підставі відповідей нижче, я зміг створити простий тест, який демонструє поведінку Друша, і зробити деякі висновки:

Поведінка Drush за замовчуванням під час виконання операцій на кількох сайтах полягає у використанні одночасних процесів:

$ drush @localdev ev "drupal_set_message(time()); sleep(5);"

Continue?  (y/n): y
site1             >> 1360512943      [status]
site2             >> 1360512943      [status]
site3             >> 1360512943      [status]

Це справедливо навіть тоді, коли не використовуються псевдоніми, а також правдиво, коли використовується вбудований псевдонім @sites Друша. Ці дві команди дають однакову поведінку, як описано вище:

$ drush site1,site2,site3 ev "drupal_set_message(time()); sleep(5);"
$ drush @sites ev "drupal_set_message(time()); sleep(5);"

Щоб змінити кількість одночасних процесів (за замовчуванням дорівнює 4), в команді drush можна передати опцію '--concurrency = N'. Наприклад, якщо потрібно послідовне виконання, я можу встановити кількість одночасних процесів на 1:

$ drush @localdev ev "drupal_set_message(time()); sleep(5);" --concurrency=1

Continue?  (y/n): y
site1             >> 1360513387      [status]
site2             >> 1360513393      [status]
site3             >> 1360513399      [status]

Це дуже хороший підсумок; дякую, що написав це. Було б чудово, якби ця інформація десь була в документації Друша. Я відкрив проблему для захоплення , що: drupal.org/node/1914224
greg_1_anderson

Відповіді:


5

Це працювало для мене:

drush @site1,@site2,@site3,@site4 cc all --concurrency=4

Я не впевнений, наскільки це було насправді; останнє повідомлення про site1 надійшло відразу після першого повідомлення для site2, а всі інші повідомлення друкувалися послідовно. Я не вимірював, в якій мірі кожна операція на ЦП відбувається одночасно, або в якій мірі система щойно була пов'язана з процесором або введенням вводу, але, здавалося, працює номінально.


Я працюю з чимось подібним до цього і зрозумів зручний спосіб робити речі за допомогою @sitesкоманди. Однак одна проблема з цим полягає в тому, що якщо каталог сайтів є символьним посиланням, команда не розпізнає його. у моєму випадку симпосилання - на реж поза корінням drupal, тому ls- l дає: site_dir -> ../../sites/site/src.. можливо, це помилка, яку я можу виправити, якщо ви можете вказати мені на код, відповідальний за створення
списку

1

Для одного примірника (без списку сайтів):

<?php
$aliases['localdev'] = array(
  'invoke-multiple' => TRUE,
);
?>

Для псевдонімів з масивом списку сайтів він буде працювати впевнено навіть ...

Після коментарів нижче , давайте розглянемо код для drush_invoke_process:
//- мій коментар, /* ... */- скорочення наданого коду.

<?php
function drush_invoke_process($site_alias_record, $command_name, $commandline_args = array(), $commandline_options = array(), $backend_options = TRUE) {
  if (is_array($site_alias_record) && array_key_exists('site-list', $site_alias_record)) {
    /*  $invocations[] - this array filled with command for each site in site-list. */
  }
  else {
    /* aliases not defined or site-list not found.  So $invocations filled by one item. */
  }
  return drush_backend_invoke_concurrent($invocations, $commandline_options, $backend_options);
}
?>

Наступний дзвінок:

<?php
function drush_backend_invoke_concurrent($invocations, $common_options = array(), $common_backend_options = array(), $default_command = NULL, $default_site = NULL, $context = NULL) {
  /* Here building command line happen for each site (invocation). */
  return _drush_backend_invoke($cmds, $common_backend_options, $context);
}
?>

Далі буде називатися:

<?php
function _drush_backend_invoke($cmds, $common_backend_options = array(), $context = NULL) {
  /* Some simulating code and fork code */
  if (array_key_exists('interactive', $common_backend_options) || array_key_exists('fork', $common_backend_options)) {
    /* Direct running (interactive or fork) */
  }
  else {
    // Concurrency set to 4 by default. So --concurency just override it by another value.
    $process_limit = drush_get_option_override($common_backend_options, 'concurrency', 4);

    // Next is main call, that run commands as concurent processes using proc_open and streaming:
    $procs = _drush_backend_proc_open($cmds, $process_limit, $context);

    /* Processing of result running of processes. */

  }
  return empty($ret) ? FALSE : $ret;
}
?>

Ви можете, будь ласка, уточнити? Ви хочете сказати, що при використанні списку сайтів Drush автоматично виконує команди одночасно на всіх сайтах? Я розгублений, оскільки сервіс Drush припустив, що поведінка за замовчуванням - це послідовне виконання drupal.org/node/628996#comment-2637008 .
rcourtna

invoke-multiple - це виконання однієї і тієї ж команди на одному сайті з однаковими параметрами та аргументами кілька разів. Ви хочете --concurrency = N для запуску однієї і тієї ж команди на кількох сайтах. Такий намір все-таки є; Я не тестував @sites або "список-сайт", але ви відхиляєтесь від передбачуваної поведінки, якщо це станеться спрацьовим.
greg_1_anderson

Ви маєте рацію щодо --конкурсу; якщо ви запускаєте команду на декількох сайтах в режимі налагодження без - concurrency і без --invoke-multiple, ви можете легко побачити, що вона виконує всі команди одночасно. Але знову ж таки, 'invoke-multiple' => TRUE нічого не робить, а встановлення його на 2 в псевдонімі сайту призведе до того, що всі ваші команди запускаються двічі.
greg_1_anderson

2greg_1_anderson: налаштування invoke_multiple запрацює, якщо ви не встановите псевдонім або список сайтів ...
Nikit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.