あるサブプロセスが他のサブプロセスを枯渇させないようにするにはどうすればよいですか?


10

明確にするために、私はemacsをマルチスレッド化する必要のあることについては何も話していません(おそらくこれも解決されるでしょう)。再現するには:

  1. emacs -Q#24.4.1を実行しています
  2. 2番目のフレームを作成する
  3. 最初のフレームに戻る
  4. MXシェル
  5. Mx rename-uniquely(後で2番目のシェルを作成します)
  6. 実行を開始: while true; do echo "hello world"; done
  7. 2番目のフレームでは、Mxシェル

2番目のシェルが表示されることはほとんどありません(まれに繰り返し試行しても機能します)。どうやらemacsは、最初のシェルの出力を読み取って他のプロセスからの出力をリッスンすることを決して中断しません。保留中の出力を持つ複数のプロセスがある場合、ラウンドロビンの方がはるかに良い動作になります。より良い行動をとる方法はありますか?

私が知っている唯一のトリックは、シェルバッファーを独自のプロセスにすることですが、残念ながらそれは私にはうまくいきません。それを行ったとしても、音声認識ソフトウェアが機能するようにソケットをリッスンするサブプロセスを実行する必要があります。そうすれば、シェルを最初に実際に制御できるようになります。これが、私がこれを発見した方法です。上記のような無限ループを実行すると、データがソケットから取り出されなくなります。


1
質問に対する具体的な回答はありません。ただし、私start-processはa set-process-filterとa を使用するのが好きset-process-sentinelです-これにより、プロセスの実行中に他のことを実行して陽気な方法に進むことができます- エコー領域が触れられないように*Messages*使用して出力をバッファーに送信することもできますinsert、または使用します専用のプロセス出力バッファー(必要な場合)。たとえば、長いrsyncセッションを実行できます。私はstart-process、複数の同時/時間のかかるを実行しようとした経験はありません。そのため、Emacsがそれらのすべての処理をどのように処理するかわかりません。
法律家、2015

2
うーん面白い発見。両方のシェルの下位は別々のプロセスであり、明らかにEmacsはまだ問題なくメインコマンドループを処理しています。ただし、下位のFDをポーリングすると、常に最初のシェルで何かが検出され、2番目のFDを処理することができないと思います。最初のシェルでwhile [1]を終了すると、期待どおりに2番目のシェルが実際に表示されます。これはおそらくdevメーリングリストへの質問です。
stsquad 2015

私は別の問題を抱えていますが、それはフレームのついた問題です:lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger

回答:


2

したがって、これは適切な解決策ではありませんが、テストを逆に実行し(たとえば、2番目のシェルでwhile [1])、正常に機能します。回避策として、大量の出力を生成する可能性のあるシェルバッファーが、対話性が必要なシェルバッファーよりも後に作成されるようにすることができます。このようにして、対話型シェルは、Emacsの下位ポーリングによって最初に処理されてから、大量の出力を生成するものを最終的に処理します。

実際には、選択した対話型シェルを実行している場合は、I / Oをそれほど長く占有している状況にはならないでしょう。定期的にそのようなものが必要な場合は、出力をファイルにリダイレクトし、表示モードを使用する方が良いソリューションでしょうか?


1
ここでの問題は、誤って無限ループを書くことは難しくないということです。また、コマンドを実行するときにI / OIを実行する計画について考える必要もありません。emacsを使用することの全体的な利点は、すべてが既に保存可能な適切なバッファーにあるということです:)
Joseph Garvin

1
@JosephGarvinありがとうございます。あなたの優れた再生装置を使ってMx report-bugする場合、私は最良の解決策だと思います。
stsquad 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.