Làm thế nào để sử dụng khả năng thực thi đồng thời của Drush?


9

Tôi đang sử dụng nhiều trang web Drupal (codebase đơn, nhiều trang web / *). Cùng với điều này, tôi đã bắt đầu sử dụng bí danh Drush để quản lý chúng:

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

Điều này cho phép tôi dễ dàng thực hiện các hành động trên tất cả các trang web:

$ drush @localdev cc all

>> Tôi cũng vừa phát hiện ra rằng tôi chỉ có thể sử dụng @sites và từ bỏ tệp drushrc .

Làm điều này, sẽ thực thi "cc all" trên mỗi trang web của tôi theo chuỗi (mỗi lần một trang).

Tôi muốn đưa nó lên cấp độ tiếp theo và thử chạy các lệnh này trên tất cả các trang web một cách mô phỏng . Tôi đã làm một số đọc, và sáng ấn tượng rằng Drush không thực sự hỗ trợ này. Hàm drush_invoke_ process () lấy $ backend_options, có thể chứa (từ tài liệu hàm):

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

Tuy nhiên, điều tôi không thể tìm ra là làm thế nào để tôi thực sự sử dụng nó từ dòng lệnh Drush . Có một tùy chọn tôi cần chuyển đến Drush không, hay tôi cần đặt thứ gì đó trong tệp cài đặt?

Bất kỳ thông tin sẽ được nhiều đánh giá cao - sự tò mò của tôi được khơi dậy!

CẬP NHẬT

Dựa trên các câu trả lời dưới đây, tôi đã có thể tạo một bài kiểm tra đơn giản thể hiện hành vi của Drush và rút ra một số kết luận:

Hành vi mặc định của Drush khi thực hiện các hoạt động trên nhiều trang web là sử dụng các quy trình đồng thời:

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

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

Điều này đúng ngay cả khi không sử dụng bí danh và cũng đúng khi sử dụng bí danh @sites tích hợp của Drush. Hai lệnh này mang lại hành vi giống hệt như trên:

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

Để thay đổi số lượng quy trình đồng thời (mặc định là 4), tùy chọn '--concurrency = N' có thể được thông qua trong lệnh drush. Ví dụ: nếu tôi muốn thực hiện nối tiếp, tôi có thể đặt số lượng quy trình đồng thời thành 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]

Đó là một bản tóm tắt rất tốt; cảm ơn vì đã viết nó lên Sẽ thật tuyệt nếu thông tin đó có trong tài liệu Drush ở đâu đó. Tôi đã mở một vấn đề để nắm bắt rằng: drupal.org/node/1914224
greg_1_anderson

Câu trả lời:


5

Điều này làm việc cho tôi:

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

Tôi không chắc nó thực sự đồng thời như thế nào; tin nhắn cuối cùng về site1 xuất hiện ngay sau tin nhắn đầu tiên cho site2 và tất cả các tin nhắn khác được in liên tục. Tôi đã không đo lường mức độ mà mỗi hoạt động cc xảy ra đồng thời, hoặc mức độ nào hệ thống có thể chỉ bị ràng buộc cpu hoặc i / o, nhưng dường như nó vẫn hoạt động bình thường.


Tôi đang làm việc với một cái gì đó tương tự như thế này và nhận ra một cách hữu ích để làm mọi thứ bằng cách sử dụng @siteslệnh. Tuy nhiên, một trục trặc với nó là nếu thư mục trang web là một liên kết tượng trưng, ​​lệnh không nhận ra nó. trong trường hợp của tôi, symlink là một thư mục bên ngoài root drupal vì vậy tôi sẽ đưa ra: site_dir -> ../../sites/site/src.. có lẽ đó là lỗi tôi có thể sửa nếu bạn có thể chỉ cho tôi mã chịu trách nhiệm xây dựng thelist
awm

1

Đối với trường hợp đơn (không có danh sách trang web):

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

Đối với các bí danh có mảng danh sách trang, nó sẽ chạy đồng thời thậm chí ...

Sau khi nhận xét bên dưới , hãy xem lại mã cho drush_invoke_ process:
//- nhận xét của tôi, /* ... */- rút ngắn mã được cung cấp.

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

Tiếp theo được gọi là:

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

Tiếp theo sẽ gọi:

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

Bạn có thể vui lòng làm rõ? Bạn có nói rằng khi sử dụng danh sách trang web, Drush sẽ tự động thực hiện các lệnh đồng thời trên tất cả các trang web? Tôi bối rối vì một người bảo trì Drush cho rằng hành vi mặc định là thực thi nối tiếp drupal.org/node/628996#comment-2637008 .
RCourtna

invoke-many là để chạy cùng một lệnh trên cùng một trang với cùng tùy chọn và đối số nhiều lần. Bạn muốn --concurrency = N để chạy cùng một lệnh trên nhiều trang web. Dù sao đó cũng là ý định; Tôi đã không kiểm tra với @sites hoặc 'danh sách trang web', nhưng bạn đang đi lạc ngoài hành vi dự định, nếu điều đó xảy ra để làm việc.
greg_1_anderson

Bạn đã đúng về --concurrency; nếu bạn chạy một lệnh trên nhiều trang trong chế độ gỡ lỗi mà không có --concurrency và không có --invoke-many, bạn có thể dễ dàng thấy rằng nó đang chạy đồng thời tất cả các lệnh. Nhưng một lần nữa, 'invoke-many' => TRUE không làm gì cả và đặt nó thành 2 trong bí danh trang web sẽ khiến tất cả các lệnh của bạn chạy hai lần.
greg_1_anderson

2greg_1_anderson: cài đặt invoke_multipl sẽ hoạt động nếu bạn không 'đặt bí danh hoặc danh sách trang web ...
Nikit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.