4

外部スクリプト/コマンドを呼び出す必要がある eventmachine を使用して記述した小さな HTTP サーバー スクリプトがあり、バッククォート ( ``) を介して呼び出します。バックティックされたコードを実行しないリクエストを提供する場合、すべて問題ありませんが、EM コードがバックティックされた外部スクリプトを実行するとすぐに、リクエストの提供を停止し、一般的に実行を停止します。

eventmachine はサブプロセスやスレッドに敏感で、popenこの目的のためのメソッドを持っているように見えますが、EM のソースは、このメソッドは Windows では機能しないと警告しています。このスクリプトを実行しているマシンの多くは Windows を実行しているため、popen.

私はここで運が悪いのでしょうか?Windows で eventmachine スクリプトから外部コマンドを実行する安全な方法はありますか? EM の実行をブロックせずに、外部で実行するコマンドを起動する方法はありますか?

編集: EMを最も台無しにしているように見える犯人は、次のように、Windowsstartコマンドの私の使用法ですstart java myclass。start を使用する理由は、これらの外部スクリプトの実行を開始し、EM リクエストが処理された後も実行を継続するためです。

4

3 に答える 3

1

rubyのドキュメントには、バックティック演算子が「サブシェルで実行中の cmd の標準出力を返す」と記載されています。

したがって、コマンド ie start java myclass が引き続き実行されている場合、ruby はその出力がプログラムに返されるのを待っています。

于 2010-03-22T23:56:31.647 に答える
1

win32-open3を試してください(Windows のみではなくクロスプラットフォームである必要がある場合は、POpen4も参照してください) 。

于 2010-04-11T13:41:23.287 に答える
0

EventMachine にはスレッド プールがあります。このようにバックティックを行うことができEM.deferます

EM.defer { `start java myclass` }

デフォルトでは、スレッド プールには 20 個のスレッドがありEM.threadpool_size、値を割り当てることでそのサイズを変更できます。

EM.defer遅延スレッドで実行される操作、リアクター スレッドで実行されるコールバック、および操作で例外が発生したときにリアクター スレッドで実行されるエラー コールバックを渡すことができることに注意してください。

Java を使用している場合は、実際のスレッドをサポートする jruby の使用を検討してください。おそらく、jruby 内から Java コードを再利用できます。

于 2015-11-26T23:25:43.773 に答える