다음 코드가 있습니다.
child = pexpect.spawn("prog")
#some delay...
child.expect(Name .*: )
child.sendline('anonymous')
자식 프로세스가 시작되면 로그 정보와 같은 많은 데이터를 표준 출력으로 보내기 시작할 수 있습니다. pexpect가 모든 자식의 표준 출력을 조회하기 시작한다는 의미입니까 (프로세스 시작부터 현재 순간까지)? 아니면 pexpect가 expect
전화를 한 후에 시작 합니까?
내 자식 프로세스는 많은 로그 정보를 만듭니다. 그리고 CPU는 매우 느립니다. 그런 pexpect의 구현이 원인이 될 수 있다고 생각합니다.
자식 프로세스가 생성 된 후 자식은 write()
데이터를 pty (슬레이브 측)로 보내고 부모가 read()
pty (마스터 측)의 데이터를 기다 립니다. 없는 경우 쓰기 버퍼가 가득 차서 너무 많은 데이터를 출력 할 때 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의 문서에 따르면 두 가지 spawn () 옵션이 성능에 영향을 미칠 수 있습니다.
maxread
속성은 판독 버퍼 크기를 설정한다. 이것은 Pexpect가 한 번에 TTY에서 읽으려고 시도하는 최대 바이트 수입니다.maxread
크기를로 설정하면1
버퍼링이 해제됩니다. 값을 더 높게 설정하면maxread
많은 양의 출력이 자식에서 다시 읽혀지는 경우 성능에 도움이 될 수 있습니다. 이 기능은와 함께 유용합니다searchwindowsize
.키워드 인수
searchwindowsize
가None
(기본값)이면 들어오는 데이터를 수신 할 때마다 전체 버퍼가 검색됩니다. 각 반복에서 스캔되는 기본 바이트 수는 매우 크고 검색 비용을 부수적으로 줄이기 위해 줄일 수 있습니다 .expect()
반환 후 전체 버퍼 속성은 값에maxread
관계없이 최대 크기로 유지됩니다searchwindowsize
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다