Help us understand the problem. What is going on with this article?

[Capistrano]単一サーバに対しシェルコマンドを並行して実行したい

More than 5 years have passed since last update.

状況

  • 踏み台サーバがあり、各個別サーバにはそこ経由でしか入れない
  • MySQLサーバが4つある
  • MySQLサーバ4つに対し、たとえば mysqldump したい
  • 逐次実行でもいいけどえらい時間がかかるな〜って思っている
  • 踏み台サーバには、GNU parallel が入っていない……

parallel というDSLがすでにある

これは、複数サーバに対し並行実行するので、単一サーバには向かない。
gemもいい感じのものが無さそうに見える。

こんなの書いた

def run_parallel(parallel_size)
  threads = []
  parallel_size.times do |i|
    threads << Thread.new do
      logger.info "starting concurrent task in #{parallel_size} threads"
      logger.info "started - thread #{i}"
      yield i
      logger.info "finished - thread #{i}"
    end
  end
  threads.each {|t| t.join }
end

Usage

run_parallel 4 do |i|
  run 'sleep 120'
end
  • ちゃんと4並行で sleep が走る!
  • 結果、120秒前後で全ジョブが終わるはず

TODO

Good name

udzura
投稿しているコードは、指定が無い限り MIT とします。
http://udzura.hatenablog.jp
pepabo
「いるだけで成長できる環境」を標榜し、エンジニアが楽しく開発できるWebサービス企業を目指しています。
https://pepabo.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away