簡體   English   中英

pexpect sendline 太慢了

[英]pexpect sendline is too slow

我正在使用 pexpect 運行一個子進程。 我通過 sendline 和 readline 斷斷續續地與它通信。 cProfile 表明我的程序大部分時間都在等待發送線完成,這不是我們想要的行為。 Python偽代碼:

def reset(self):
  self.proc = pexpect.spawn("node ./my_lovely_program.js")
...
def step(self, info):
    self.proc.sendline(info)
    while (my_condition):
        response = self.proc.readline().decode()
        # evaluate my_condition
    return retval

同時,在等待用戶在 Node.js 中輸入輸入的風格中,我的節點應用程序很好地隱藏了:

let ans = await this.askQuestion("");
// do_stuff(ans);

這同時由相關類的兩個不同實例運行。 這一切都很好,運行令人滿意。 然后我跑

python3 -m cProfile -s cumtime main.py

得到這個:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    498/1    0.002    0.000  262.820  262.820 {built-in method builtins.exec}
        1    0.107    0.107  262.820  262.820 main loop
        1    0.099    0.099  262.081  262.081 also main loop
     3774    0.022    0.000  214.272    0.057 main.py:24(step)
    33596  203.977    0.006  203.977    0.006 {built-in method time.sleep}
     3774    0.017    0.000  189.138    0.050 pty_spawn.py:570(sendline)
     3774    0.049    0.000  189.105    0.050 pty_spawn.py:526(send)
     3875    0.158    0.000   53.767    0.014 main.py:28(scrape_input)
    14756    0.052    0.000   53.434    0.004 spawnbase.py:459(readline)
    14756    0.056    0.000   53.382    0.004 spawnbase.py:240(expect)
    14756    0.072    0.000   52.985    0.004 spawnbase.py:343(expect_list)
    14756    0.242    0.000   52.848    0.004 expect.py:91(expect_loop)
    29721    0.235    0.000   47.113    0.002 pty_spawn.py:415(read_nonblocking)
    69657    0.113    0.000   46.250    0.001 pty_spawn.py:448(select)
    69657    0.103    0.000   46.137    0.001 utils.py:130(select_ignore_interrupts)
    69657   46.016    0.001   46.016    0.001 {built-in method select.select}
...

其中,readline,尤其是sendline,占了程序運行時間的90%以上。 大部分時間都在睡覺。 這是非常可悲的,我想解決它。 我每次發送 20-30 個字符。 我嘗試以其他方式從 stdin 讀取(例如https://www.dev2qa.com/node-js-get-user-input-from-command-line-prompt-example/ )並准備繼續下去這條路,如果那是要走的路。 (我遇到的問題是一個單獨的問題;在第二次通信中,輸入被讀取兩次)。 使用 popen 捕獲進程輸出時的 Posix_spawn 性能 我記得幾個月前使用它並且它陷入僵局。

pexpect 的 send() 等待時間默認為 50 毫秒。 您可以通過設置禁用此功能:

proc.delaybeforesend = None

請參閱文檔以解釋他們為什么要延遲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM