Drush의 동시 실행 기능을 사용하는 방법은 무엇입니까? 옵션이 있습니까, 아니면 설정 파일에서

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의 기본 동작은 동시 프로세스를 사용하는 것입니다.

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

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

별칭을 사용하지 않는 경우에도 마찬가지이며 Drush의 내장 @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]



답변

이것은 나를 위해 일했다 :

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

나는 그것이 실제로 얼마나 동시 적인지 확신하지 못한다. site1에 대한 마지막 메시지는 site2에 대한 첫 번째 메시지 바로 뒤에 왔으며 다른 모든 메시지는 순차적으로 인쇄되었습니다. 각 cc 작업이 동시에 어느 정도까지 발생했는지 또는 시스템이 CPU 또는 i / o에 바인딩 된 정도까지 측정하지는 않았지만 명목상 작동하는 것 같습니다.


답변

단일 인스턴스 (사이트 목록 없음) :

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


답변