Wie verhindere ich, dass ein Teilprozess andere verhungert?

10

Um es klar auszudrücken, ich spreche nicht von irgendetwas, bei dem Emacs Multithreading erfordern sollten (obwohl dies wahrscheinlich auch das lösen würde). Reproduzieren:

  1. emacs -Q # Ich verwende 24.4.1
  2. Machen Sie einen zweiten Frame
  3. Wechseln Sie zurück zum ersten Frame
  4. Mx Shell
  5. Mx eindeutig umbenennen (wir werden später eine zweite Shell erstellen)
  6. Lauf: while true; do echo "hello world"; done
  7. Im zweiten Frame Mx-Shell

Die zweite Shell wird fast nie angezeigt (selten funktioniert sie nach wiederholten Versuchen). Anscheinend machen Emacs niemals eine Pause vom Lesen der Ausgabe der ersten Shell, um die Ausgabe zu hören, die von einem anderen Prozess eingeht. Es wäre viel besser, ein Round-Robin-Verfahren durchzuführen, wenn mehrere Prozesse mit ausstehender Ausgabe vorhanden sind. Gibt es eine Möglichkeit, sich besser zu verhalten?

Der einzige Trick, den ich kenne, wäre, den Shell-Puffer zu einem eigenen Prozess zu machen, aber das funktioniert leider nicht für mich. Selbst wenn ich das mache, muss ich einen Unterprozess ausführen, um einen Socket abzuhören, damit meine Spracherkennungssoftware funktioniert, damit ich die Shell überhaupt steuern kann. So habe ich das entdeckt. Durch Ausführen einer Endlosschleife wie oben wird verhindert, dass Daten aus dem Socket entfernt werden.

Joseph Garvin
quelle
1
Ich habe keine konkrete Antwort auf Ihre Frage. Ich verwende es jedoch gerne start-processmit a set-process-filterund a set-process-sentinel- dies ermöglicht es mir, meinen lustigen Weg zu gehen, andere Dinge zu tun, während der Prozess ausgeführt wird - ich sende meine Ausgabe manchmal sogar mit an den *Messages*Puffer, insertdamit mein Echo-Bereich unberührt bleibt, oder ich benutze einen dedizierten Prozessausgabepuffer (falls erforderlich). Zum Beispiel kann ich eine lange rsyncSitzung durchführen. Ich habe keine Erfahrung damit, mehrere gleichzeitig / lang laufen zu lassen start-process, daher bin ich mir nicht sicher, wie Emacs mit einer Menge von allen umgehen würde.
Lawlist
2
Hmm interessanter Fund. Beide Shell-Inferiors sind separate Prozesse, und offensichtlich verarbeitet Emacs seine Hauptbefehlsschleife weiterhin ohne Probleme. Ich vermute jedoch, dass beim Abfragen der minderwertigen FDs immer etwas auf der ersten Shell gefunden wird und die zweite FD nie verarbeitet werden kann. Wenn Sie die Weile [1] in der ersten Shell töten, wird die zweite Shell tatsächlich wie erwartet angezeigt. Dies ist wahrscheinlich eine Frage an die Entwickler-Mailingliste.
stsquad
Ich habe ein anderes Problem, aber es ist smiliair mit Frames: lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger

Antworten:

2

Das ist also keine richtige Lösung, aber ich habe Ihren Test umgekehrt durchgeführt (z. B. while [1] auf der zweiten Shell) und er funktioniert einwandfrei. Um dies zu umgehen, können Sie sicherstellen, dass alle Shell-Puffer, die wahrscheinlich eine hohe Ausgabe erzeugen, später erstellt werden als diejenigen, bei denen Sie Interaktivität wünschen. Auf diese Weise werden die interaktiven Shells als erste von Emacs 'minderwertiger Umfrage behandelt, bevor sie schließlich diejenige verarbeiten, die viel Ausgabe generiert.

In der Praxis, wenn Sie eine Auswahl interaktiver Shell ausführen, werden Sie wahrscheinlich nicht in einer Situation sein, in der man die E / A so lange belastet. Wenn Sie so etwas regelmäßig benötigen, ist es möglicherweise eine bessere Lösung, die Ausgabe in eine Datei umzuleiten und den Ansichtsmodus zu verwenden.

stsquad
quelle
1
Das Problem hier ist, dass es nicht schwer ist, versehentlich eine Endlosschleife zu schreiben. Ich würde auch lieber nicht darüber nachdenken müssen, wie viel I / OI beim Ausführen von Befehlen vorhat. Der ganze Vorteil der Verwendung von Emacs ist, dass sich alles bereits in einem schönen speicherbaren Puffer befindet :)
Joseph Garvin
1
@ JosephGarvin Das weiß ich zu schätzen. Ich denke die beste Lösung, wenn Sie Mx Report-Bug mit Ihrem exzellenten Reproducer.
stsquad