ฉันจะป้องกันหนึ่ง subprocess จากการอดอาหารอื่น ๆ ได้อย่างไร


10

เพื่อความชัดเจนฉันไม่ได้พูดถึงสิ่งที่ควรกำหนดให้ emacs เป็นแบบมัลติเธรด ในการทำซ้ำ:

  1. emacs -Q # ฉันทำงาน 24.4.1
  2. ทำเฟรมที่สอง
  3. สลับกลับไปที่เฟรมแรก
  4. Mx เชลล์
  5. Mx เปลี่ยนชื่อไม่ซ้ำใคร (เราจะสร้างเชลล์ที่สองในภายหลัง)
  6. เริ่มวิ่ง: while true; do echo "hello world"; done
  7. ในเฟรมที่สอง Mx shell

เชลล์ที่สองแทบจะไม่แสดงผลเลย (แทบจะไม่ได้ผลเลยหลังจากพยายามซ้ำหลายครั้ง) เห็นได้ชัดว่า emacs จะไม่มีวันหยุดพักจากการอ่านเอาต์พุตของเชลล์แรกเพื่อฟังเอาต์พุตที่มาจากกระบวนการอื่น ๆ มันจะเป็นพฤติกรรมที่ดีกว่ามากสำหรับการปัดโรบินเมื่อมีหลายกระบวนการที่มีเอาต์พุตที่ค้างอยู่ มีวิธีใดที่จะทำให้พฤติกรรมดีขึ้นหรือไม่

เคล็ดลับเดียวที่ฉันรู้คือการทำให้เชลล์บัฟเฟอร์เป็นกระบวนการของตัวเอง แต่น่าเสียดายที่มันไม่ได้ผลสำหรับฉัน แม้ว่าฉันจะทำเช่นนั้นฉันก็ต้องเรียกใช้ subprocess เพื่อฟังซอคเก็ตเพื่อให้ซอฟต์แวร์รู้จำเสียงพูดทำงานได้เพื่อที่ฉันจะสามารถควบคุมเชลล์ได้ตั้งแต่แรกนั่นคือวิธีที่ฉันค้นพบสิ่งนี้ การเรียกใช้ลูปไม่สิ้นสุดเช่นด้านบนป้องกันไม่ให้ข้อมูลใด ๆ ถูกถอดออกจากซ็อกเก็ต


1
ฉันไม่มีคำตอบเฉพาะสำหรับคำถามของคุณ อย่างไรก็ตามฉันชอบที่จะใช้start-processกับ a set-process-filterและ a set-process-sentinel- สิ่งนี้ช่วยให้ฉันสามารถทำสิ่งอื่น ๆ ได้ในขณะที่กระบวนการทำงาน - ฉันยังส่งผลลัพธ์ของฉันไปยัง*Messages*บัฟเฟอร์โดยใช้บางครั้งเพื่อinsertให้พื้นที่ echo ของฉันไม่ถูกแตะต้องหรือใช้ บัฟเฟอร์เอาต์พุตกระบวนการเฉพาะ (ถ้าจำเป็น) ตัวอย่างเช่นฉันสามารถเรียกใช้rsyncเซสชั่นที่มีความยาว ฉันไม่มีประสบการณ์ใด ๆ ที่พยายามใช้หลาย ๆ อย่างพร้อมกัน / มีความยาวstart-processดังนั้นฉันไม่แน่ใจว่า Emacs จะจัดการกับสิ่งเหล่านี้ได้อย่างไร
lawlist

2
อืมค้นพบที่น่าสนใจ เชลล์ผู้ด้อยโอกาสทั้งสองเป็นกระบวนการที่แยกจากกันและเห็นได้ชัดว่า Emacs ยังคงประมวลผลลูปคำสั่งหลักโดยไม่มีปัญหา อย่างไรก็ตามฉันสงสัยว่าเมื่อทำการสำรวจ FDs ที่ด้อยกว่ามันจะพบบางสิ่งบนเปลือกแรกและไม่เคยได้รับการประมวลผล FD ที่สอง ถ้าคุณฆ่า [1] ในเปลือกแรกเปลือกที่สองจะเกิดขึ้นตามที่คุณคาดหวัง นี่อาจเป็นคำถามสำหรับรายการส่งเมลของ dev
stsquad

ฉันมีปัญหาอื่น แต่ smiliair กับ frames: lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger

คำตอบ:


2

ดังนั้นนี่ไม่ใช่วิธีการแก้ปัญหาที่เหมาะสม แต่ฉันทดสอบการทดสอบของคุณในลักษณะอื่น (เช่นขณะที่ [1] บนเปลือกที่สอง) และทำงานได้ดี ในฐานะที่เป็นวิธีแก้ไขปัญหาคุณสามารถมั่นใจได้ว่าเชลล์บัฟเฟอร์ใด ๆ ที่มีแนวโน้มที่จะสร้างเอาต์พุตจำนวนมากจะถูกสร้างขึ้นช้ากว่าที่คุณต้องการการโต้ตอบ วิธีนี้เชลล์แบบโต้ตอบจะเป็นคนแรกที่ได้รับการจัดการโดยการสำรวจความคิดเห็นที่ด้อยกว่าของ Emacs ก่อนที่จะจัดการกับสิ่งที่สร้างผลลัพธ์จำนวนมาก

ในทางปฏิบัติหากคุณใช้การเลือกเชลล์แบบอินเทอร์แอคทีฟคุณจะไม่อยู่ในสถานการณ์ที่มี I / O hogs อยู่เป็นเวลานาน หากคุณต้องการสิ่งดังกล่าวเป็นประจำบางทีการเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์และการใช้โหมดดูเป็นทางออกที่ดีกว่า


1
ปัญหานี่คือมันไม่ยากที่จะเขียนวนรอบไม่สิ้นสุดโดยไม่ได้ตั้งใจ ฉันยังต้องการที่จะไม่คิดเกี่ยวกับแผน I / OI ว่าต้องทำอย่างไรเมื่อเรียกใช้คำสั่ง ประโยชน์ของการใช้ทั้ง emacs เป็นว่าทุกอย่างที่มีอยู่แล้วในที่ดีบัฟเฟอร์ประหยัดสามารถ :)
โจเซฟ Garvin

1
@JosephGarvin ฉันขอขอบคุณที่ ฉันคิดว่าทางออกที่ดีที่สุดหาก Mx รายงานข้อผิดพลาดกับ reproducer ที่ยอดเยี่ยมของคุณ
stsquad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.