동시성과 병렬성은 현대 프로그래밍의 필수 개념으로, 애플리케이션이 인터리브 실행(동시성) 또는 동시 실행(병렬성)을 통해 여러 작업을 동시에 수행할 수 있도록 해줍니다. 주로 동기 실행 모델로 알려진 PHP는 다양한 기술을 통해 이러한 패러다임을 지원하도록 발전해 왔습니다.
PHP는 특히 일반적인 웹 서버 설정에서 Apache와 함께 사용될 때 전통적으로 동기 실행 모델을 따릅니다. 이 모델에서는 각 HTTP 요청이 단일 PHP 프로세스에 의해 처리됩니다. 요청 처리와 관련된 단계는 다음과 같습니다.
이 모델은 단순성과 이해의 용이성을 보장하지만 병렬 실행이 필요한 작업이나 여러 작업을 동시에 처리하는 작업에는 비효율적일 수 있습니다.
웹 애플리케이션이 더욱 복잡해짐에 따라 PHP에서 동시 및 병렬 실행에 대한 필요성도 커졌습니다. 이러한 패러다임을 달성하기 위해 PHP가 제공하는 기술을 살펴보겠습니다.
동기 코드는 작업이 차례로 수행되는 가장 간단한 실행 형태입니다.
echo "Synchronous Code Example:\n"; function synchronousFunction() { for ($i = 0; $i < 3; $i++) { echo "Synchronous Loop Iteration: $i\n"; sleep(1); } } synchronousFunction();
이 예에서 루프의 각 반복은 반복 사이에 1초의 지연을 두고 순차적으로 실행됩니다. 이 접근 방식은 간단하지만 병렬 실행의 이점을 누릴 수 있는 I/O 중심 작업이나 CPU 집약적 작업에는 비효율적입니다.
포킹은 원래 프로세스(상위)와 동시에 실행되는 새 프로세스(하위)를 생성합니다. 이는 작업을 병렬화하는 데 유용합니다.
echo "\nForking Process Example:\n"; function forkProcess() { $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { echo "Parent Process: PID $pid\n"; pcntl_wait($status); // Protect against Zombie children } else { echo "Child Process: Hello from the child process!\n"; exit(0); } } forkProcess();
이 코드에서 pcntl_fork()는 하위 프로세스를 생성합니다. 상위 프로세스와 하위 프로세스가 동시에 실행되므로 병렬 작업 실행이 가능합니다. 상위 프로세스는 좀비 프로세스 생성을 피하기 위해 하위 프로세스가 완료될 때까지 기다립니다.
PHP의 스레딩 기능은 pthread와 같은 확장을 통해 사용할 수 있습니다. 스레드는 프로세스보다 가볍고 동일한 메모리 공간을 공유하므로 공유 데이터가 필요한 작업에 적합합니다.
if (!class_exists('Thread')) { die("Threads are not supported in this PHP build\n"); } echo "\nThreading Example:\n"; class MyThread extends Thread { public function run() { for ($i = 0; $i < 3; $i++) { echo "Thread Loop Iteration: $i\n"; sleep(1); } } } $thread = new MyThread(); $thread->start(); $thread->join();
이 예제는 Thread를 확장하는 MyThread 클래스를 정의합니다. run 메소드는 메인 스레드와 동시에 실행되는 새로운 스레드에서 실행됩니다. 이 접근 방식은 스레드가 리소스 대기를 처리할 수 있는 I/O 바인딩 작업에 유용합니다.
생성기는 간단한 코루틴을 구현하는 방법을 제공하여 함수가 전체 프로그램을 차단하지 않고 반복적으로 결과를 생성할 수 있도록 합니다.
echo "\nGenerators Example:\n"; function simpleGenerator() { yield 'First'; yield 'Second'; yield 'Third'; } $gen = simpleGenerator(); foreach ($gen as $value) { echo "Generator Yielded: $value\n"; }
생성기는 Yield 키워드를 사용하여 한 번에 하나씩 값을 생성함으로써 기능을 일시 중지하고 다시 시작할 수 있도록 하여 협력적인 멀티태스킹 형태를 촉진합니다.
PHP는 동기식 기반에서 시작해 다양한 형태의 동시성 및 병렬성을 지원하는 데 많은 발전을 이루었습니다. 동기 코드는 많은 사용 사례에서 간단하고 효과적이지만 프로세스 포크, 스레딩 및 생성기 사용과 같은 기술은 복잡하고 병렬화 가능한 작업을 효율적으로 처리할 수 있는 새로운 가능성을 열어줍니다.
위 내용은 PHP의 동시성과 병렬성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!