วิธีการใช้ความสามารถในการดำเนินการพร้อมกันของ Drush


9

ฉันกำลังใช้ Drupal multi-sites (รหัสฐานเดียวหลายไซต์ / *) นอกจากนี้ฉันเริ่มใช้นามแฝง 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" ในแต่ละไซต์ของฉันในซีรีส์ (หนึ่งครั้ง)

ผมอยากจะใช้เวลานี้ในระดับต่อไปและพยายามที่จะเรียกใช้คำสั่งเหล่านี้บนเว็บไซต์ทั้งหมดsimulantiously ฉันได้ทำอ่านบางและฉันรู้สึกว่า 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 หรือฉันต้องตั้งค่าบางอย่างในไฟล์การตั้งค่าหรือไม่?

ข้อมูลใด ๆ ที่จะได้รับการชื่นชมมาก - ความอยากรู้ของฉันป่องๆ!

UPDATE

จากคำตอบด้านล่างนี้ฉันสามารถสร้างการทดสอบอย่างง่าย ๆ ที่แสดงพฤติกรรมของ 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 คำสั่งสองคำสั่งเหล่านี้ให้ผลการทำงานที่เหมือนกันกับด้านบน:

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

หากต้องการเปลี่ยนจำนวนกระบวนการที่เกิดขึ้นพร้อมกัน (ค่าเริ่มต้นคือ 4) ตัวเลือก '--concurrency = N' สามารถส่งผ่านได้ในคำสั่ง drush ตัวอย่างเช่นถ้าฉันต้องการประมวลผลแบบอนุกรมฉันสามารถกำหนดจำนวนกระบวนการที่เกิดขึ้นพร้อมกันเป็น 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

คำตอบ:


5

สิ่งนี้ใช้ได้กับฉัน:

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

ฉันไม่แน่ใจว่ามันเกิดขึ้นพร้อมกันได้อย่างไร ข้อความสุดท้ายเกี่ยวกับ site1 มาทันทีหลังจากข้อความแรกสำหรับ site2 และข้อความอื่น ๆ ทั้งหมดจะถูกพิมพ์ตามลำดับ ฉันไม่ได้วัดระดับการดำเนินการของแต่ละซีซีพร้อมกันหรือในขอบเขตที่ระบบอาจเพิ่งจะเป็น cpu หรือ i / o ที่ถูกผูกไว้ แต่ดูเหมือนว่าจะใช้งานได้ในนาม


ฉันทำงานกับสิ่งที่คล้ายกับสิ่งนี้และตระหนักถึงวิธีที่สะดวกในการทำสิ่งต่าง ๆ โดยใช้@sitesคำสั่ง อย่างไรก็ตามข้อผิดพลาดอย่างหนึ่งอย่างหนึ่งคือถ้าไดเรกทอรีไซต์เป็น symlink คำสั่งจะไม่รู้จัก ในกรณีของฉัน symlink คือการ dir นอกรูต drupal ดังนั้น ls-l ให้: site_dir -> ../../sites/site/src.. บางทีมันอาจเป็นข้อผิดพลาดที่ฉันสามารถแก้ไขได้ถ้าคุณสามารถชี้ให้ฉันดูรหัสที่รับผิดชอบในการสร้างรายการ thelist
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 จะเรียกใช้คำสั่งโดยอัตโนมัติพร้อมกันในทุกไซต์หรือไม่ ฉันสับสนเพราะดูแล Drush ชี้ให้เห็นว่าพฤติกรรมเริ่มต้นคือการดำเนินการอนุกรมdrupal.org/node/628996#comment-2637008
rcourtna

invoke-multiple ใช้สำหรับรันคำสั่งเดียวกันบนไซต์เดียวกันพร้อมตัวเลือกและอาร์กิวเมนต์ที่เหมือนกันหลายครั้ง คุณต้องการ --concurrency = N สำหรับการเรียกใช้คำสั่งเดียวกันในหลาย ๆ ไซต์ นั่นคือความตั้งใจต่อไป; ฉันไม่ได้ทดสอบกับ @sites หรือ 'รายชื่อไซต์' แต่คุณหลงผิดไปจากพฤติกรรมที่ตั้งใจควรจะเกิดขึ้น
greg_1_anderson

คุณถูกต้องเกี่ยวกับ --concurrency; หากคุณเรียกใช้คำสั่งในหลาย ๆ ไซต์ในโหมดดีบั๊กโดยไม่มี --concurrency และไม่มี - invoke-multiple คุณสามารถเห็นได้อย่างง่ายดายว่ามันกำลังรันคำสั่งทั้งหมดพร้อมกัน แต่อีกครั้ง 'invoke-multiple' => TRUE ไม่ทำอะไรเลยและการตั้งค่าเป็น 2 ในนามแฝงของไซต์จะทำให้คำสั่งทั้งหมดของคุณทำงานสองครั้ง
greg_1_anderson

2greg_1_anderson: การตั้งค่า invoke_multiple จะทำงานหากคุณไม่ได้ตั้งชื่อแทนหรือรายชื่อไซต์ ...
Nikit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.