2011-04-12 3 views
0

PHP에서 흥미로운 "threading" concept을 테스트하고 있습니다. 기본적으로, 부모 프로세스가 물건을 할 아이들을 스폰하고 콜백 방식의 일종의 STDOUT을 통해 부모에게 결과를 반환합니다.STDOUT에서 스트리밍 결과를 놓치지 않고 PHP 스크립트를 조절/느리게하는 방법이 있습니까?

방법 my example는, 내부 루프가 너무 꽉를 수행하고 99 %의 CPU 화상 : 예를 들어,

while(true){ 
     $ret = $thread->Listen(); 
     if($ret == 'DOINGSTUFF'){ 
       break; 
     } 
} 

내가 아래로 사용하여 5 초마다 반복이 while 루프를 조율하고 싶습니다를 sleep(). 이렇게하면 CPU 사용률을 훨씬 합리적인 수준으로 끌어 올릴 수 있습니다. 그러나 나는 부모의 수면 과정 중에 한 어린이가 끝내는 경우에 결과를 반환하는 어린이 "실"의 일부를 "놓칠"것이라고 염려합니다.

PHP 전문가가이 관심사가 잘 성립되었는지 여부를 알 수 있습니까? 그렇다면 내가 수행 할 수있는 조치가 있는지 여부를 PHP 전문가가 알려 줄 수 있습니까?

답변

2

이 예제에서는 정확히 멀티 스레딩이 아닌 proc_open을 사용합니다. proc_open를 사용하는 경우 어쨌든, 파이프 스트림 프로세스가 실제로 종료 된 경우에도 한 proc_close가 호출되지로 사용할 수 있습니다 :

$proc = proc_open('which ls', $descriptorspec, $pipes); 
sleep(5); 
echo stream_get_contents($pipes[1]); // output '/bin/ls' 

$proc = proc_open('which ls', $descriptorspec, $pipes); 
sleep(5); 
proc_close($proc); 
echo stream_get_contents($pipes[1]); // E_WARNING: $pipes[1] not a valid stream 

또한,이 sleep를 사용할 필요가 없습니다. 일반적으로, 매 패스마다 아무 것도하지 않고 5 초 동안 스크립트를 매달 리는 것을 원하지 않습니다. ,

while (true) { 
    // do stuff 
    usleep(50); 
} 

위의 50 마이크로 초 동안 잠을 것입니다 실행중인 다른 프로세스에 CPU 사이클을 떠나 : 또한 CPU 사용량을 줄일 수 있지만, 아직 스크립트가 반응 할 것이다, 대신 usleep를 사용합니다.

순수 멀티 스레딩의 경우 PHP에서는 불가능합니다. 할 수있는 일은 프로세스를 포크하는 것입니다. 실제 포킹과 사용하는 방법 (proc_open)의 차이점은 상위 프로세스 데이터 (변수 등)도 하위 프로세스로 분기된다는 것입니다. 포킹은 웹 애플리케이션에서 사용되어서는 안되며, 명령 행 프로그램에서만 사용되어야한다. 왜냐하면 웹 서버는 이것을 아주 잘 지원하지 않기 때문이다.

1

글쎄, 이미 눈치 챘을 때, (true)는 CPU를 태우는 것이고, 당신은 그것을 "느리게"할 수는 없습니다. 앱이 청취자, 즉 소켓처럼 행동하기를 원합니다. 뭔가 말하고 싶을 때만 활성화됩니다. 그렇지 않으면 휴면 상태로 유지되고 "수신 대기"합니다. 정말 포트 중 하나에 수신기를 만들고 예제를 다시 시도해야합니다. 리스너를 모방하면 아무런 이유없이 CPU 사이클이 소모됩니다. 서버와 여러 클라이언트 (프로세스)가 연결되어있어 원하는 방식으로 리소스를 공유 할 수 있으므로 프로세스 간 통신도 쉬워집니다.

또한 PHP에서의 스레딩은 프로세스를 포크하는 것으로 실제 스레딩이 아니며 OS에 부담이됩니다. 병렬로 수행하기를 원하지 않는 한, 모든 비용으로 포크를하지 말아야합니다.

관련 문제