后,孩子会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