後,孩子會write()
其數據發送到pty(從側),並從PTY(主機側)等待父母read()
數據。如果沒有child.expect()
,則由於寫入緩衝區已滿而輸出太多數據時,可能會阻止孩子的write()
。
當child.expect()
匹配一個模式,它會返回,然後你必須再次調用child.expect()
,否則在輸出太多數據後孩子可能仍然被阻塞。
見下面的例子:
# python
>>> import pexpect
>>> ch = pexpect.spawn('find /')
>>> ch
<pexpect.pty_spawn.spawn object at 0x7f47390bae90>
>>>
此時find
被催生和它已經輸出一些數據。但我沒有撥打ch.expect()
,所以find
現在被阻止(睡眠),並且不消耗CPU。
# ps -C find u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 100831 0.0 0.2 9188 2348 pts/12 Ss+ 10:23 0:00 /usr/bin/find/
# strace -p 100831
Process 100831 attached
write(1, "\n", 1 <-- The write() is being blocked
這裏的STAT S
意味着睡覺(和s
意味着會議領導,+
意味着前臺進程)。
根據Pexpect的的文件,產卵的兩個選項()可能會影響性能:
的maxread
屬性設置讀取緩衝區的大小。這是Pexpect一次嘗試從TTY讀取的最大字節數。將maxread
大小設置爲1
將關閉緩衝。 設置maxread
較高的值可能有助於在從孩子讀取大量輸出的情況下的性能。 此功能與searchwindowsize
一起使用非常有用。
當關鍵字參數searchwindowsize
爲None
(默認值)時,將在每次接收傳入數據的迭代中搜索完整緩衝區。在每次迭代中掃描的默認字節數非常大,可以減少 和以減少搜索成本。 expect()
返回後,完整的緩衝區屬性 保持高達maxread
的大小,與searchwindowsize
的值無關。
什麼是*分析*?什麼是* CP *? – pynexj
@whjm即pexpect是否存儲所有stdout數據?當孩子。expect()'調用pexpect是否查找所有流(從流程開始到當前時刻)?如果這是真的,那麼pexpect會執行很多工作(如果孩子爲其stdout寫入了許多數據) – Mergasov