คำถามติดแท็ก subprocess

2
จะป้องกันไม่ให้ช้าลงเมื่อกระบวนการที่ด้อยกว่าสร้างเส้นยาวได้อย่างไร
ฉันใช้ Emacs กับ Geiser เพื่อแฮกรหัส Scheme ขณะที่ฉันเล่นไปรอบ ๆ ใน REPL บางครั้งฉันประเมินนิพจน์ที่ให้ผลลัพธ์จำนวนมากซึ่งมักจะอยู่ในหนึ่งบรรทัด ตัวอย่างเช่นฉันเพิ่งเล่นกับ SRFI-41 (สตรีม) และสร้างสตรีมตัวละครจากไฟล์ขนาดใหญ่ จากนั้นฉันบังคับสตรีมและ Geiser แก้ไขเนื้อหาทั้งหมดของไฟล์เป็นสตรีมอักขระลงในบัฟเฟอร์ของฉัน เกือบจะในทันที Emacs ต้องหยุดชะงักเหมือนตัวละครมากขึ้นเรื่อย ๆ ที่ต่อท้ายบรรทัดเอาท์พุทและไม่ว่าฉันจะกดค้างไว้นานเท่าไหร่C-gหรือC-c C-cไม่สามารถหยุด Emacs (หรือ Geiser) ได้ สิ่งนี้ทำให้เซสชัน Emacs ของฉันทั้งหมดเสียหายเนื่องจากตอนนี้ Emacs ไม่สนใจอินพุตของฉันอย่างสมบูรณ์โดยคิดว่าจำเป็นต้องให้ความสำคัญกับการพิมพ์สตรีมตัวละครขนาดใหญ่นี้ในบรรทัดเดียวให้เป็นบัฟเฟอร์ Geiser REPL ที่ไม่ตอบสนอง มีสิ่งที่ฉันสามารถทำได้เพื่อปกป้องเซสชั่น Emacs ของฉันจากความอยากรู้อยากเห็นของฉันทำลาย? (เพราะเหตุใด Emac จึงช้ามากเมื่อแสดงเส้นที่ยาวมากอยู่แล้ว) ฉันสามารถกำหนดขีด จำกัด ของเส้นยาวและบอก Emacs ได้ว่าไม่เป็นไรที่จะไม่พยายามแสดงเส้นที่ยาวมาก ๆ ?

1
แบบอะซิงโครนัสรอผลลัพธ์จากกระบวนการ comint
ก่อนอื่นข้อจำกัดความรับผิดชอบ ฉันค้นคว้ามาหลายครั้งแล้วและฉันค่อนข้างมั่นใจว่าฉันได้พบคำตอบแล้วไม่ทางใดก็ทางหนึ่ง แต่ฉันก็ไม่เข้าใจ ปัญหาของฉันคือต่อไปนี้: ฉันมีกระบวนการทำงานผ่าน comint ฉันต้องการส่งบรรทัดอินพุตจับเอาต์พุตและดูเมื่อมันจบ (เมื่อบรรทัดสุดท้ายของเอาต์พุตตรงกับ regexp สำหรับพรอมต์) เมื่อกระบวนการส่งเอาต์พุตเสร็จสิ้นแล้วเท่านั้นฉันต้องการส่งอินพุตอีกบรรทัดหนึ่ง (ตัวอย่าง) สำหรับพื้นหลังเล็กน้อยให้คิดว่าเป็นโหมดหลักที่ใช้การโต้ตอบกับโปรแกรมซึ่งอาจส่งคืนเอาต์พุตจำนวนเท่าใดก็ได้ในเวลานานโดยพลการ นี่ไม่ควรเป็นสถานการณ์ที่ผิดปกติใช่มั้ย โอเคบางทีส่วนที่ฉันต้องรอระหว่าง อินพุตนั้นผิดปกติ แต่ก็มีข้อดีเล็กน้อยในการส่งอินพุตโดยรวม: บัฟเฟอร์เอาต์พุตถูกจัดรูปแบบเป็นอย่างดี: อินพุตเอาต์พุตอินพุตเอาต์พุต ... ที่สำคัญกว่านั้นเมื่อส่งข้อความจำนวนมากไปยังกระบวนการข้อความจะถูกตัดเป็นชิ้น ๆ และชิ้นส่วนจะถูกวางกลับโดยกระบวนการ จุดตัดเป็นสิ่งที่ไม่แน่นอนและบางครั้งสิ่งนี้ทำให้อินพุตไม่ถูกต้อง (กระบวนการของฉันจะไม่วางกลับอย่างถูกต้องเช่นการป้อนข้อมูลที่อยู่ตรงกลางของตัวระบุ) อย่างไรก็ตามผิดปกติหรือไม่ปรากฏว่ามีความซับซ้อน ตอนนี้ฉันกำลังใช้บางสิ่งบางอย่างตามแนวของ (defun mymode--wait-for-output () (let ((buffer (mymode-get-buffer))) (with-current-buffer buffer (goto-char (point-max)) (forward-line 0) (while (not (mymode-looking-at-prompt)) (accept-process-output nil 0.001) (redisplay) (goto-char (point-max)) (forward-line 0)) …

1
ฉันจะป้องกันหนึ่ง subprocess จากการอดอาหารอื่น ๆ ได้อย่างไร
เพื่อความชัดเจนฉันไม่ได้พูดถึงสิ่งที่ควรกำหนดให้ emacs เป็นแบบมัลติเธรด ในการทำซ้ำ: emacs -Q # ฉันทำงาน 24.4.1 ทำเฟรมที่สอง สลับกลับไปที่เฟรมแรก Mx เชลล์ Mx เปลี่ยนชื่อไม่ซ้ำใคร (เราจะสร้างเชลล์ที่สองในภายหลัง) เริ่มวิ่ง: while true; do echo "hello world"; done ในเฟรมที่สอง Mx shell เชลล์ที่สองแทบจะไม่แสดงผลเลย (แทบจะไม่ได้ผลเลยหลังจากพยายามซ้ำหลายครั้ง) เห็นได้ชัดว่า emacs จะไม่มีวันหยุดพักจากการอ่านเอาต์พุตของเชลล์แรกเพื่อฟังเอาต์พุตที่มาจากกระบวนการอื่น ๆ มันจะเป็นพฤติกรรมที่ดีกว่ามากสำหรับการปัดโรบินเมื่อมีหลายกระบวนการที่มีเอาต์พุตที่ค้างอยู่ มีวิธีใดที่จะทำให้พฤติกรรมดีขึ้นหรือไม่ เคล็ดลับเดียวที่ฉันรู้คือการทำให้เชลล์บัฟเฟอร์เป็นกระบวนการของตัวเอง แต่น่าเสียดายที่มันไม่ได้ผลสำหรับฉัน แม้ว่าฉันจะทำเช่นนั้นฉันก็ต้องเรียกใช้ subprocess เพื่อฟังซอคเก็ตเพื่อให้ซอฟต์แวร์รู้จำเสียงพูดทำงานได้เพื่อที่ฉันจะสามารถควบคุมเชลล์ได้ตั้งแต่แรกนั่นคือวิธีที่ฉันค้นพบสิ่งนี้ การเรียกใช้ลูปไม่สิ้นสุดเช่นด้านบนป้องกันไม่ให้ข้อมูลใด ๆ ถูกถอดออกจากซ็อกเก็ต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.