Bir alt işlemin başkalarını aç bırakmasını nasıl önleyebilirim?


10

Açık olmak gerekirse, emacs'ın çok iş parçacıklı olmasını gerektiren herhangi bir şeyden bahsetmiyorum (muhtemelen bu da çözülecektir). Yeniden üretmek:

  1. emacs -Q # 24.4.1 çalıştırıyorum
  2. İkinci bir kare yapın
  3. İlk kareye geri dön
  4. Mx kabuk
  5. Mx benzersiz olarak yeniden adlandır (daha sonra ikinci bir kabuk yapacağız)
  6. Koşmaya başla: while true; do echo "hello world"; done
  7. İkinci çerçevede, Mx kabuğu

İkinci kabuk neredeyse hiç görüntülenmeyecektir (nadiren tekrarlanan denemelerden sonra çalışır). Görünüşe göre emacs, herhangi bir başka işlemden gelen çıkışı dinlemek için ilk kabuğun çıktısını okumaktan asla mola vermeyecektir. Bekleyen çıktıya sahip birden çok işlem olduğunda, robin'i yuvarlaması çok daha iyi bir davranış olacaktır. Daha iyi davranışlar elde etmenin bir yolu var mı?

Bildiğim tek hile kabuk tamponunu kendi süreci haline getirmek olurdu, ama maalesef bu benim için işe yaramayacak. Bunu yapsam bile, konuşma tanıma yazılımımın çalışması için bir soketi dinlemek için bir alt süreç çalıştırmam gerekiyor, böylece kabuğu ilk etapta kontrol edebiliyorum, bunu bu şekilde keşfettim; yukarıdaki gibi sonsuz bir döngü çalıştırmak herhangi bir verinin soketten alınmasını önler.


1
Sorunuza özel bir cevabım yok. Bununla birlikte, start-processa set-process-filterve a ile kullanmayı seviyorum set-process-sentinel- bu işlem devam ederken başka şeyler yapmamın yolunu açmama izin veriyor - Hatta yankı alanımın dokunulmaması için çıktımı bazen *Messages*ara belleğe gönderiyorum insertveya kullanıyorum özel bir işlem çıkış tamponu (gerekirse). Örneğin, uzun bir rsyncoturum çalıştırabilirim . Birden fazla eşzamanlı / uzun çalıştırmaya çalıştığım herhangi bir deneyimim yok start-process, bu yüzden Emacs'ın hepsini nasıl halledeceğinden emin değilim.
hukukçu

2
Hmm ilginç bul. Her iki kabuk alt tarafı ayrı süreçlerdir ve Emacs hala ana komut döngüsünü sorunsuz bir şekilde işlemektedir. Bununla birlikte, daha düşük FD'leri yokladığında her zaman ilk kabukta bir şey bulur ve asla ikinci FD'yi işlemez. İlk mermide süreyi [1] öldürürseniz, ikinci mermi gerçekten beklediğiniz gibi ortaya çıkar. Bu muhtemelen geliştirici posta listesi için bir sorudur.
stsquad

Başka bir sorunum var, ancak çerçevelerle gülümsüyor
ReneFroger

Yanıtlar:


2

Yani bu uygun bir çözüm değil ama testinizi tersine çevirdim (örneğin ikinci kabukta [1]) ve iyi çalışıyor. Etrafında bir çalışma olarak, ağır çıktı üretmesi muhtemel kabuk tamponlarının etkileşim istediğinizden daha sonra oluşturulmasını sağlayabilirsiniz. Bu şekilde etkileşimli mermiler, Emacs'ın düşük anketi tarafından nihayetinde çok miktarda çıktı üreten gemiyi kullanmadan önce ele alınan ilk kabuklardır.

Uygulamada, bir dizi etkileşimli kabuk çalıştırıyorsanız, büyük olasılıkla birisinin G / Ç'yi bu kadar uzun süre tuttuğu bir durumda olmayacaksınız. Düzenli olarak böyle bir şeye ihtiyacınız varsa, çıktıyı bir dosyaya yönlendirmek ve görüntüleme modunu kullanmak daha iyi bir çözümdür?


1
Buradaki mesele, kazayla sonsuz bir döngü yazmak zor değil. Ayrıca komutları çalıştırırken ne kadar G / Ç planı yapmayı planlamak zorunda kalmamayı tercih ederim. Emacs kullanmanın tüm avantajı, her şeyin zaten güzel bir kurtarılabilir tamponda olmasıdır :)
Joseph Garvin

1
@JosephGarvin Bunu takdir ediyorum. Ben mükemmel üreme Mx rapor-bug için en iyi çözüm düşünüyorum.
stsquad
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.