Bagaimana cara mencegah satu subproses dari membuat orang lain kelaparan?

10

Untuk lebih jelasnya, saya tidak berbicara tentang apa pun yang harus memerlukan emacs untuk multithreaded (meskipun itu mungkin juga akan menyelesaikan masalah ini). Untuk mereproduksi:

  1. emacs -Q # Saya menjalankan 24.4.1
  2. Buat bingkai kedua
  3. Beralih kembali ke bingkai pertama
  4. Shell mx
  5. Mx ganti nama-secara unik (kita akan membuat shell kedua nanti)
  6. Mulai berlari: while true; do echo "hello world"; done
  7. Dalam bingkai kedua, shell Mx

Shell kedua hampir tidak akan pernah ditampilkan (jarang berhasil setelah upaya berulang). Rupanya emacs tidak akan pernah berhenti dari membaca output dari shell pertama untuk mendengarkan output yang datang dari proses lain. Ini akan menjadi perilaku yang jauh lebih baik baginya untuk round robin ketika ada beberapa proses dengan output yang tertunda. Apakah ada cara untuk mendapatkan perilaku yang lebih baik?

Satu-satunya trik yang saya tahu adalah membuat buffer shell prosesnya sendiri, tetapi sayangnya itu tidak akan berhasil untuk saya. Bahkan jika saya melakukan itu, saya harus menjalankan subproses untuk mendengarkan soket agar perangkat lunak pengenalan suara saya bekerja sehingga saya dapat benar-benar mengontrol shell di tempat pertama, itulah bagaimana saya menemukan ini; menjalankan infinite loop seperti di atas mencegah data diambil dari soket.

Joseph Garvin
sumber
1
Saya tidak punya jawaban spesifik untuk pertanyaan Anda. Namun, saya suka menggunakan start-processdengan a set-process-filterdan set-process-sentinel- ini memungkinkan saya melakukan cara merry melakukan hal-hal lain saat proses berjalan - saya bahkan mengirim output kadang-kadang ke *Messages*buffer menggunakan insertsehingga area gema saya tidak tersentuh, atau saya menggunakan buffer output proses khusus (jika perlu). Misalnya, saya bisa menjalankan rsyncsesi yang panjang . Saya tidak punya pengalaman mencoba menjalankan beberapa secara simultan / panjang start-process, jadi saya tidak yakin bagaimana Emacs akan menangani banyak dari mereka semua terjadi.
lawlist
2
Hmm cari yang menarik. Kedua inferior shell adalah proses yang terpisah dan jelas Emacs masih memproses loop perintah utamanya tanpa masalah. Namun saya curiga ketika melakukan polling FD inferior selalu menemukan sesuatu pada shell pertama dan tidak pernah memproses FD kedua. Jika Anda membunuh sementara [1] di shell pertama, shell kedua memang muncul seperti yang Anda harapkan. Ini mungkin pertanyaan untuk milis dev.
stsquad
Saya memiliki masalah lain, tetapi ini smiliair dengan bingkai: lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger

Jawaban:

2

Jadi ini bukan solusi yang tepat tetapi saya menjalankan tes Anda sebaliknya (mis. Sementara [1] pada shell kedua) dan itu berfungsi dengan baik. Sebagai pekerjaan di sekitar Anda dapat memastikan bahwa setiap buffer shell yang cenderung menghasilkan output yang berat dibuat lebih lambat daripada yang Anda inginkan interaktivitas. Dengan begitu shell interaktif adalah yang pertama ditangani oleh polling rendah Emacs sebelum akhirnya menangani yang menghasilkan banyak output.

Dalam praktiknya jika Anda menjalankan pilihan shell interaktif, Anda mungkin tidak akan berada dalam situasi di mana seseorang memakan I / O begitu lama. Jika Anda secara teratur membutuhkan hal seperti itu, mungkin mengarahkan kembali output ke file dan menggunakan mode tampilan adalah solusi yang lebih baik?

stsquad
sumber
1
Masalahnya di sini adalah tidak sulit untuk menulis infinite loop secara tidak sengaja. Saya juga lebih suka tidak harus memikirkan berapa banyak rencana I / OI yang harus dilakukan ketika menjalankan perintah. Seluruh keuntungan menggunakan emacs adalah semuanya sudah ada dalam buffer yang bagus: :)
Joseph Garvin
1
@ JosephephGarvin Saya menghargai itu. Saya pikir solusi terbaik jika untuk MX bug-bug dengan reproduksi yang sangat baik Anda.
stsquad