Bagaimana cara menggunakan kemampuan eksekusi bersamaan Drush?

9

Saya menggunakan Drupal multi-situs (basis kode tunggal, beberapa situs / *). Seiring dengan ini, saya sudah mulai menggunakan alias Drush untuk mengelolanya:

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

Ini memungkinkan saya untuk dengan mudah melakukan tindakan di semua situs:

$ drush @localdev cc all

>> Saya juga baru tahu bahwa saya bisa menggunakan @Situs , dan melupakan file drushrc .

Melakukan ini, akan menjalankan "cc all" di setiap situs saya secara seri (satu per satu).

Saya ingin membawa ini ke level berikutnya dan mencoba menjalankan perintah ini di semua situs secara simultan . Saya telah melakukan beberapa bacaan, dan am di bawah kesan bahwa Drush tidak memang mendukung ini. Fungsi drush_invoke_process () membutuhkan $ backend_options, yang dapat berisi (dari dokumentasi fungsi):

 *      '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'.

Apa yang saya tidak tahu, bagaimanapun, adalah bagaimana saya benar-benar menggunakan ini dari baris perintah Drush . Apakah ada opsi yang perlu saya sampaikan ke Drush, atau apakah saya perlu mengatur sesuatu di file pengaturan?

Info apa pun akan sangat dihargai - keingintahuan saya terguncang!

MEMPERBARUI

Berdasarkan jawaban di bawah ini, saya dapat membuat tes sederhana yang menunjukkan perilaku Drush, dan menarik beberapa kesimpulan:

Perilaku default Drush ketika menjalankan operasi di banyak situs adalah menggunakan proses bersamaan:

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

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

Ini benar bahkan ketika tidak menggunakan alias, dan juga benar ketika menggunakan alias situs bawaan Drush. Dua perintah ini menghasilkan perilaku yang identik seperti di atas:

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

Untuk mengubah jumlah proses bersamaan (default adalah 4), opsi '--concurrency = N' dapat diteruskan dalam perintah drush. Misalnya, jika saya ingin eksekusi serial, saya dapat mengatur jumlah proses bersamaan menjadi 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]
rcourtna
sumber
Itu ringkasan yang sangat bagus; terima kasih telah menulisnya. Akan lebih bagus jika info itu ada di dokumentasi Drush di suatu tempat. Saya membuka masalah untuk menangkap bahwa: drupal.org/node/1914224
greg_1_anderson

Jawaban:

5

Ini bekerja untuk saya:

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

Saya tidak yakin seberapa serentak itu sebenarnya; pesan terakhir tentang site1 datang segera setelah pesan pertama untuk site2, dan semua pesan lainnya dicetak secara berurutan. Saya tidak mengukur sampai sejauh mana setiap operasi cc terjadi secara bersamaan, atau sejauh mana sistem tersebut mungkin hanya cpu atau i / o terikat, tetapi tampaknya secara nominal berfungsi.

greg_1_anderson
sumber
Saya bekerja dengan sesuatu yang mirip dengan ini dan menyadari cara praktis untuk melakukan sesuatu menggunakan @sitesperintah. Namun, satu kesalahan dengan itu adalah bahwa jika direktori situs adalah symlink, perintah itu tidak mengenalinya. dalam kasus saya symlink adalah ke dir di luar drupal root jadi ls- l memberikan: site_dir -> ../../sites/site/src..mungkin itu bug yang bisa saya perbaiki jika Anda bisa mengarahkan saya ke kode yang bertanggung jawab untuk membuat daftar thelist
awm
1

Untuk satu contoh (tanpa daftar situs):

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

Untuk alias dengan susunan daftar situs, ia akan berjalan secara bersamaan bahkan ...

Setelah komentar di bawah , mari kita tinjau kode untuk drush_invoke_process:
//- komentar saya, /* ... */- memperpendek kode yang disediakan.

<?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);
}
?>

Selanjutnya disebut:

<?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);
}
?>

Selanjutnya akan dipanggil:

<?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;
}
?>
Nikit
sumber
Bisakah Anda mengklarifikasi? Apakah Anda mengatakan bahwa ketika menggunakan daftar situs, Drush akan secara otomatis menjalankan perintah secara bersamaan di semua situs? Saya bingung karena pengelola Drush menyarankan bahwa perilaku default adalah eksekusi serial drupal.org/node/628996#comment-2637008 .
rcourtna
invoke-multiple adalah untuk menjalankan perintah yang sama di situs yang sama dengan opsi dan argumen yang sama beberapa kali. Anda ingin --concurrency = N untuk menjalankan perintah yang sama di banyak situs. Itulah intinya; Saya tidak menguji dengan @Situs atau 'daftar-situs', tetapi Anda menyimpang dari perilaku yang dimaksudkan, jika itu berhasil.
greg_1_anderson
Anda benar tentang --concurrency; jika Anda menjalankan perintah di beberapa situs dalam mode debug tanpa --concurrency dan tanpa --invoke-multiple, Anda dapat dengan mudah melihat bahwa ia menjalankan semua perintah secara bersamaan. Tetapi sekali lagi, 'invoke-multiple' => TRUE tidak melakukan apa-apa, dan mengaturnya ke 2 di sebuah situs alias akan membuat semua perintah Anda berjalan dua kali.
greg_1_anderson
2greg_1_anderson: setelan invoke_multiple akan berfungsi jika Anda tidak menetapkan alias atau daftar situs ...
Nikit