Questions tagged «subprocess»

2
下等工序产生长线时,如何防止减速?
我将Emacs与Geiser结合使用以破解一些Scheme代码。当我在REPL中玩耍时,有时我会评估会产生大量输出的表达式,通常都是一行。 例如,我只是玩SRFI-41(流),并从一个大文件创建了一个字符流。然后我强制了流,Geiser将文件的全部内容作为字符流倒入了我的缓冲区。几乎立即,随着越来越多的字符附加到输出行,Emacs停顿了下来,无论我持续按下多长时间C-g还是C-c C-c无法使Emacs(或Geiser)停止。 这打断了我的整个Emacs会话,因为Emacs现在完全忽略了我的输入,认为它需要优先考虑将这一庞大的字符流全部打印到无响应的Geiser REPL缓冲区中。 有什么我可以保护我的Emacs会话免受破坏性好奇心的吗?(为什么在显示很长的行时Emacs为什么会变得这么慢?)我可以设置长行的限制并告诉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)) (end-of-line)))) 在每次发送输入行之后以及发送下一行之前,我每次都会调用此命令。好吧...它起作用了,已经存在了。 但这也会使emacs在等待输出时挂起。原因很明显,而且我发现如果sleep-for在循环中包含某种异步(例如1s),它将使输出延迟1s,但可以抑制挂起。除了似乎这种异步 sleep-for 不存在。 还是呢?更笼统地说,是否有使用emacs实现此目的的惯用方式?换一种说法: 如何将输入发送到进程,等待输出,然后异步发送更多输入? 在四处搜寻时(请参阅相关问题),我主要看到提到前哨(但我认为这不适用于我的情况,因为该过程尚未完成)和一些复杂的钩子(但是那又该怎么办?使该钩子在局部缓冲,将我的“评估剩余的行”转换为一个函数,将该函数添加到该钩子中,然后再清理该钩子?这听起来确实很脏,不是吗?)。 很抱歉,如果我自己说不清楚,或者某个地方确实有一个明显的答案,那么我将对流程交互的所有复杂性感到困惑。 如果需要,我可以将其全部作为一个可行的示例,但恐怕它只会像我之前发现的所有对我没有帮助的问题一样,使另外一个“具有特定过程答案的特定过程问题”。 关于SO的一些相关问题: /programming//q/16815598/1083706 /programming//q/3572532/1083706 /programming//q/6578373/1083706

1
如何防止一个子进程饿死其他子进程?
明确地说,我不是在谈论任何需要emacs多线程的东西(尽管这也可能会解决这个问题)。复制: emacs -Q#我正在运行24.4.1 制作第二帧 切换回第一帧 MX壳 MX唯一重命名(稍后我们将制作第二个Shell) 开始运行: while true; do echo "hello world"; done 在第二帧中,Mx shell 第二个shell 几乎不会显示(很少会反复尝试才能工作)。显然,emacs从读取第一个shell的输出到侦听来自任何其他进程的输出不会中断。当有多个进程具有待处理的输出时,对它进行循环将是更好的行为。有什么办法可以取得更好的行为? 我知道的唯一技巧是使shell缓冲自己的进程,但是不幸的是,这对我不起作用。即使这样做,我也必须运行一个子进程来侦听套接字,以使我的语音识别软件正常工作,以便我实际上可以首先控制外壳,这就是我发现这一点的方式;像上面那样运行无限循环,可以防止从套接字中取出任何数据。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.