Rails アプリケーション (または sinatra) でシェル コマンドを呼び出した場合、このコマンドはどのコンテキストで実行されますか?
質問が正しいかどうかわかりませんが、Rails プロセスと同じスレッドで実行されますか?
あなたが砲撃するとき、これを非同期呼び出しにすることは可能ですか? はいの場合、これはオペレーティング システム レベルで新しいスレッドを開始することを意味しますか? 新しいスレッドではなく、スレッドのプールで開始できますか?
Rails アプリケーション (または sinatra) でシェル コマンドを呼び出した場合、このコマンドはどのコンテキストで実行されますか?
質問が正しいかどうかわかりませんが、Rails プロセスと同じスレッドで実行されますか?
あなたが砲撃するとき、これを非同期呼び出しにすることは可能ですか? はいの場合、これはオペレーティング システム レベルで新しいスレッドを開始することを意味しますか? 新しいスレッドではなく、スレッドのプールで開始できますか?
system('cmd')
または単にバックティックを使用している場合:
`cmd`
次に、コマンドはサブシェルのコンテキストで実行されます。これらを一度に複数実行したい場合は、Ruby のフォーク機能を使用できます。
fork { system('cmd') }
fork { system('cmd') }
これにより、それぞれのサブシェルで個々のコマンドを実行する複数のサブプロセスが作成されます。
ここで分岐について読んでください: http://www.ruby-doc.org/core-2.0/Process.html#method-c-fork
これは単なる新しいスレッドではなく、完全に別個のプロセスです。これは同期され、コマンドが完了するまで制御はRubyに戻りません。ファイアアンドフォーゲットソリューションが必要な場合は、タスクをバックグラウンドで実行するだけです。
$ irb
irb(main):001:0> system("sleep 30 &")
=> true
irb(main):002:0>
$ ps ax | grep sleep
3409 pts/4 S 0:00 sleep 30
system("foo &")
またはを介して、必要な数のプロセスを開始できます`foo &`
。
ttyやその他のホストを適切にデタッチするなど、Rubyからのバックグラウンドプロセスの起動をより細かく制御したい場合は、daemonsgemを確認してください。これは、PIDファイルなどを使用して管理する長時間実行プロセスに適していますが、それを使用してタスクを起動することもできます。
ニーズに応じて、バックグラウンドプロセスを管理するための代替ソリューションがあります。resque gemは、バックグラウンドジョブのキューイングと管理に人気があります。Redisといくつかのセットアップが必要ですが、そのレベルの制御が必要な場合は便利です。