>백엔드 개발 >PHP 튜토리얼 >PHP의 동시성과 병렬성

PHP의 동시성과 병렬성

WBOY
WBOY원래의
2024-07-17 08:08:58465검색

Concurrency and Parallelism in PHP

동시성과 병렬성은 현대 프로그래밍의 필수 개념으로, 애플리케이션이 인터리브 실행(동시성) 또는 동시 실행(병렬성)을 통해 여러 작업을 동시에 수행할 수 있도록 해줍니다. 주로 동기 실행 모델로 알려진 PHP는 다양한 기술을 통해 이러한 패러다임을 지원하도록 발전해 왔습니다.

PHP의 표준 실행 모델

PHP는 특히 일반적인 웹 서버 설정에서 Apache와 함께 사용될 때 전통적으로 동기 실행 모델을 따릅니다. 이 모델에서는 각 HTTP 요청이 단일 PHP 프로세스에 의해 처리됩니다. 요청 처리와 관련된 단계는 다음과 같습니다.

  1. Apache는 HTTP 요청을 수신하여 PHP로 전달합니다.
  2. PHP는 단일 스레드에서 처음부터 끝까지 스크립트를 실행합니다.
  3. PHP는 출력을 Apache에 반환하고 Apache는 다시 클라이언트에 응답을 보냅니다.

이 모델은 단순성과 이해의 용이성을 보장하지만 병렬 실행이 필요한 작업이나 여러 작업을 동시에 처리하는 작업에는 비효율적일 수 있습니다.

PHP 동시성과 병렬성의 진화

웹 애플리케이션이 더욱 복잡해짐에 따라 PHP에서 동시 및 병렬 실행에 대한 필요성도 커졌습니다. 이러한 패러다임을 달성하기 위해 PHP가 제공하는 기술을 살펴보겠습니다.

1. 동기 코드

동기 코드는 작업이 차례로 수행되는 가장 간단한 실행 형태입니다.

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 집약적 작업에는 비효율적입니다.

2. 프로세스 포크

포킹은 원래 프로세스(상위)와 동시에 실행되는 새 프로세스(하위)를 생성합니다. 이는 작업을 병렬화하는 데 유용합니다.

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()는 하위 프로세스를 생성합니다. 상위 프로세스와 하위 프로세스가 동시에 실행되므로 병렬 작업 실행이 가능합니다. 상위 프로세스는 좀비 프로세스 생성을 피하기 위해 하위 프로세스가 완료될 때까지 기다립니다.

3. 스레딩

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 바인딩 작업에 유용합니다.

4. 발전기

생성기는 간단한 코루틴을 구현하는 방법을 제공하여 함수가 전체 프로그램을 차단하지 않고 반복적으로 결과를 생성할 수 있도록 합니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.