Drush की समवर्ती निष्पादन क्षमता का उपयोग कैसे करें?


9

मैं Drupal मल्टी-साइट्स (सिंगल कोडबेस, मल्टीपल साइट्स / *) का उपयोग कर रहा हूं। इसके साथ ही, मैंने उन्हें प्रबंधित करने के लिए ड्रश एलियासेस का उपयोग करना शुरू कर दिया है:

$ 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" निष्पादित होगा (एक समय में एक)।

मैं अगले स्तर तक ले और सभी साइटों पर इन आदेशों को चलाने के लिए प्रयास करने के लिए करना चाहते हैं simulantiously । मैं कुछ पढ़ रहा हूं, और इस धारणा के तहत कि ड्रश वास्तव में इसका समर्थन करता है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 @localdev ev "drupal_set_message(time()); sleep(5);"

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

यह तब भी सच है जब उपनाम का उपयोग नहीं किया जाता है, और ड्रू के अंतर्निहित @ उपनामों का उपयोग करते समय भी सच है। इन दोनों आदेशों में उपरोक्त के समान व्यवहार होता है:

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

समवर्ती प्रक्रियाओं की संख्या बदलने के लिए (डिफ़ॉल्ट 4 है), ड्रंक कमांड में '--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 प्रलेखन में थी। मैंने उस पर कब्जा करने के लिए एक मुद्दा खोला: drupal.org/node/1914224
greg_1_anderson 15:11

जवाबों:


5

यह मेरे लिए काम किया:

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

मुझे यकीन नहीं है कि यह वास्तव में कितना समवर्ती था; साइट 1 के बारे में पहला संदेश साइट 2 के लिए पहले संदेश के तुरंत बाद आया था, और अन्य सभी संदेश क्रमिक रूप से मुद्रित किए गए थे। मैं यह नहीं मापता था कि प्रत्येक cc ऑपरेशन किस सीमा तक हुआ है, या किस हद तक सिस्टम सिर्फ cpu या i / o बाध्य हो सकता है, लेकिन यह नाममात्र काम कर रहा है।


मैं इसके समान कुछ के साथ काम कर रहा हूं और @sitesकमांड का उपयोग करके चीजों को करने का एक आसान तरीका महसूस किया है । हालांकि, इसके साथ एक गड़बड़ यह है कि यदि साइट निर्देशिका एक सिमलिंक है, तो कमांड इसे नहीं पहचानता है। मेरे मामले में सहानुभूति drupal रूट के बाहर एक dir के लिए है, इसलिए ls- l देता है: site_dir -> ../../sites/site/src.. शायद यह बग मैं ठीक कर सकता हूं यदि आप मुझे सूची के निर्माण के लिए जिम्मेदार कोड को इंगित कर सकते हैं
awm

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 अनुचर ने सुझाव दिया कि डिफ़ॉल्ट व्यवहार धारावाहिक निष्पादन drupal.org/node/628996#comment-2637008 है
rcourtna

Invoke-multiple एक ही साइट पर एक ही कमांड को एक ही विकल्प और तर्क के साथ कई बार चलाने के लिए है। आप एकाधिक साइटों पर एक ही कमांड चलाने के लिए --concurrency = N चाहते हैं। वैसे भी इरादा है; मैंने @ साइट या 'साइट-सूची' के साथ परीक्षण नहीं किया है, लेकिन आप इच्छित व्यवहार से बाहर भटक रहे हैं, यह काम करना चाहिए।
greg_1_anderson

आप सही हैं --concurrency के बारे में; यदि आप डिबग मोड में कई साइटों पर --concurrency और बिना --invoke-multiple के एक कमांड चलाते हैं, तो आप आसानी से देख सकते हैं कि यह सभी कमांड समवर्ती रूप से चल रहा है। लेकिन फिर से, 'इनवोक-मल्टीपल' => TRUE कुछ भी नहीं करता है, और इसे 2 में स्थापित करने से एक साइट उपनाम आपके सभी आदेशों को दो बार चलाएगा।
greg_1_anderson

2greg_1_anderson: invoke_multiple सेटिंग काम करेगी यदि आप उपनाम या साइट-सूची सेट नहीं करते ...
Nikit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.