Pthreads Translation을 사용한 PHP의 다중 스레드 프로그래밍. PHP의 멀티스레드 컴퓨팅: pthreads 제다이의 길 - PCNTL 확장 사용

나는 최근에 pthread를 시도했고 기분 좋게 놀랐습니다. 이는 PHP에서 여러 실제 스레드로 작업할 수 있는 기능을 추가하는 확장입니다. 에뮬레이션도, 마법도, 가짜도 없습니다. 모든 것이 진짜입니다.



나는 그런 일을 고려하고 있다. 신속하게 완료해야 하는 작업 풀이 있습니다. PHP에는 이 문제를 해결하기 위한 다른 도구가 있지만 여기서는 언급되지 않았습니다. 이 기사는 pthread에 관한 것입니다.



pthread 란 무엇입니까?

그게 다야! 글쎄, 거의 모든 것. 사실, 호기심 많은 독자를 당황하게 할 만한 것이 있습니다. 이 중 어느 것도 기본 옵션으로 컴파일된 표준 PHP에서는 작동하지 않습니다. 멀티스레딩을 즐기려면 PHP에서 ZTS(Zend Thread Safety)를 활성화해야 합니다.

PHP 설정

다음으로 ZTS를 사용한 PHP입니다. ZTS가 없는 PHP(37.65초 대 265.05초)에 비해 실행 시간이 그렇게 큰 차이가 있다는 점에 주의하지 마세요. 공통 분모로 줄이려고 노력하지 않았습니다. PHP 설정. 예를 들어 ZTS가 없는 경우 XDebug를 활성화했습니다.


보시다시피, 2개의 쓰레드를 사용할 경우 선형 코드의 경우보다 프로그램 실행 속도가 약 1.5배 더 빨라집니다. 4개의 스레드를 사용하는 경우 - 3번.


프로세서가 8코어임에도 불구하고 4개 이상의 스레드를 사용하면 프로그램 실행 시간이 거의 변하지 않은 것을 확인할 수 있습니다. 이는 내 프로세서에 4개의 물리적 코어가 있기 때문인 것 같습니다. 명확성을 위해 플레이트를 다이어그램 형식으로 표시했습니다.


요약

PHP에서는 pthreads 확장을 사용하여 멀티스레딩으로 매우 우아하게 작업하는 것이 가능합니다. 이로 인해 생산성이 눈에 띄게 증가합니다.

태그: 태그 추가

때로는 한 데이터베이스 테이블의 변경 사항을 확인하고 다른 데이터베이스 테이블을 수정하는 등 여러 작업을 동시에 수행해야 하는 경우도 있습니다. 더욱이 작업 중 하나(예: 변경 사항 확인)에 많은 시간이 걸리는 경우 순차적 실행으로는 리소스 균형이 보장되지 않습니다.

이런 종류의 문제를 해결하기 위해 프로그래밍에서는 멀티스레딩을 사용합니다. 즉, 각 작업은 할당된 양의 리소스가 있는 별도의 스레드에 배치되고 그 내부에서 작동합니다. 이 접근 방식을 사용하면 모든 작업이 개별적으로 독립적으로 완료됩니다.

PHP는 멀티스레딩을 지원하지 않지만 이를 에뮬레이트하는 방법에는 여러 가지가 있습니다. 우리 얘기하자아래에.

1. 스크립트의 여러 복사본 실행 - 작업당 하나의 복사본

//woman.php if (!isset($_GET["thread"])) ( system("wget ​​​​http://localhost/woman.php?thread=make_me_happy"); system("wget ​​​​http: //localhost/ Woman.php?thread=make_me_rich"); ) elseif ($_GET["thread"] == "make_me_happy") ( make_her_happy(); ) elseif ($_GET["thread"] == "make_me_rich" ) ( find_another_one( ); )

매개변수 없이 이 스크립트를 실행하면 작업 ID("thread=make_me_happy" 및 "thread=make_me_rich")를 사용하여 자체 사본 두 개를 자동으로 실행하여 필요한 기능의 실행을 시작합니다.

이렇게 하면 원하는 결과를 얻을 수 있습니다. 두 작업이 동시에 수행됩니다. 그러나 이것은 물론 멀티스레딩이 아니라 단순히 작업을 동시에 수행하기 위한 버팀목일 뿐입니다.

2. 제다이의 길 - PCNTL 확장 사용

PCNTL은 프로세스 작업을 완벽하게 수행할 수 있게 해주는 확장입니다. 관리 외에도 메시지 전송, 상태 확인 및 우선 순위 설정을 지원합니다. PCNTL을 사용하는 이전 스크립트는 다음과 같습니다.

$pid = pcntl_fork(); if ($pid == 0) ( make_her_happy(); ) elseif ($pid > 0) ( $pid2 = pcntl_fork(); if ($pid2 == 0) ( find_another_one(); ) )

상당히 혼란스러워 보입니다. 한 줄씩 살펴보겠습니다.

첫 번째 줄에서는 현재 프로세스를 "포크"하여(포크는 모든 변수의 값을 유지하면서 프로세스를 복사하는 것입니다) 병렬로 실행되는 두 개의 프로세스(현재 프로세스와 하위 프로세스)로 나눕니다.

우리가 어디에 있는지 이해하려면 이 순간, 자식 또는 어머니 프로세스에서 pcntl_fork 함수는 자식에 대해 0을 반환하고 어머니에 대해 프로세스 ID를 반환합니다. 따라서 두 번째 줄에서 $pid를 확인합니다. 0이면 자식 프로세스에 있는 것입니다. 함수를 실행하는 중이고, 그렇지 않으면 어머니(4번째 줄)에 있는 다음 다른 프로세스를 생성하고 마찬가지로 작업을 수행합니다.

스크립트 실행 프로세스:

따라서 스크립트는 복사본이고 비슷한 값을 가진 동일한 변수를 포함하는 2개의 하위 프로세스를 더 만듭니다. 그리고 pcntl_fork 함수에서 반환된 식별자를 사용하여 현재 어떤 스레드에 있는지 확인하고 필요한 작업을 수행합니다.

것 같다, PHP 개발자병렬 처리는 거의 사용되지 않습니다. 동기식 코드의 단순성에 대해서는 언급하지 않겠습니다. 단일 스레드 프로그래밍은 물론 더 간단하고 명확하지만 때로는 약간의 병렬 처리를 사용하면 성능이 눈에 띄게 향상될 수 있습니다.

이 기사에서는 pthreads 확장을 사용하여 PHP에서 멀티스레딩을 구현하는 방법을 살펴보겠습니다. 이렇게 하려면 PHP 7.x의 ZTS(Zend Thread Safety) 버전이 설치되어 있어야 합니다. 설치된 확장 프로그램 p스레드 v3. (이 글을 쓰는 시점에서 PHP 7.1에서는 사용자가 pthreads 저장소의 마스터 브랜치에서 설치해야 합니다. 타사 확장 기능을 참조하세요.)

약간의 설명: pthreads v2는 PHP 5.x용이므로 더 이상 지원되지 않습니다. pthreads v3은 PHP 7.x용이며 활발히 개발되고 있습니다.

그런 여담 후에 바로 요점으로 들어가자!

일회성 작업 처리

때로는 멀티스레드 방식으로 일회성 작업을 처리하고 싶을 때도 있습니다(예: 일부 I/O 바인딩 작업 실행). 이러한 경우 Thread 클래스를 사용하여 새 스레드를 만들고 별도의 스레드에서 일부 처리를 실행할 수 있습니다.

예를 들어:

$task = 새 클래스 확장 Thread ( private $response; public function run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->response = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // 문자열 (6) "구글"

여기서 run 메소드는 새로운 스레드 내에서 실행될 처리입니다. Thread::start가 호출되면 새 스레드가 생성되고 run 메서드가 호출됩니다. 그런 다음 Thread::join 을 호출하여 하위 스레드를 메인 스레드에 다시 결합합니다. 이 호출은 하위 스레드의 실행이 완료될 때까지 차단됩니다. 이렇게 하면 결과($task->response에 저장됨)를 인쇄하기 전에 작업 실행이 완료됩니다.

흐름 논리와 관련된 추가 책임(실행 메서드 정의 책임 포함)으로 클래스를 오염시키는 것은 바람직하지 않을 수 있습니다. Threaded 클래스에서 상속받아 이러한 클래스를 구별할 수 있습니다. 그런 다음 다른 스레드 내에서 실행할 수 있습니다.

클래스 작업 확장 스레드( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $matches; ) ) $task = 새 작업; $thread = new class($task) 확장 Thread ( private $task; 공용 함수 __construct(Threaded $task) ( $this->task = $task; ) 공용 함수 run() ( $this->task->someWork( ); ) ); $thread->start() && $thread->join(); var_dump($task->응답);

별도의 스레드에서 실행되어야 하는 모든 클래스 ~ 해야 하다 Threaded 클래스에서 상속받습니다. 이는 암시적 보안 및 유용한 인터페이스(예: 리소스 동기화)뿐만 아니라 다양한 스레드에서 처리를 수행하는 데 필요한 기능을 제공하기 때문입니다.

pthreads 확장이 제공하는 클래스 계층 구조를 살펴보겠습니다.

스레드(탐색 가능, 수집 가능 구현) 스레드 작업자 휘발성 풀

우리는 이미 Thread 및 Threaded 클래스의 기본 사항을 다루고 배웠습니다. 이제 나머지 세 가지(Worker, Volatile 및 Pool)를 살펴보겠습니다.

스레드 재사용

병렬화해야 하는 각 작업에 대해 새 스레드를 시작하는 것은 상당히 비용이 많이 듭니다. 이는 PHP 내에서 멀티스레딩을 달성하려면 공통 없음 아키텍처를 pthread에서 구현해야 하기 때문입니다. 이는 생성된 각 스레드에 대해 PHP 인터프리터의 현재 인스턴스(모든 클래스, 인터페이스, 특성 및 함수 포함)의 전체 실행 컨텍스트를 복사해야 함을 의미합니다. 이는 성능에 눈에 띄는 영향을 미치므로 가능할 때마다 스트림을 항상 재사용해야 합니다. 스레드는 작업자 사용 또는 풀 사용이라는 두 가지 방법으로 재사용할 수 있습니다.

Worker 클래스는 다른 스레드 내에서 여러 작업을 동기적으로 수행하는 데 사용됩니다. 이는 새 Worker 인스턴스를 생성(새 스레드 생성)한 다음 작업을 별도의 스레드 스택(Worker::stack 사용)으로 푸시하여 수행됩니다.

다음은 작은 예입니다.

클래스 작업 확장 스레드( 개인 $value; 공용 함수 __construct(int $i) ( $this->value = $i; ) 공용 함수 run() ( usleep(250000); echo "작업: ($this->value) \n"; ) ) $worker = 새로운 작업자(); $노동자->시작(); for ($i = 0; $i stack(new Task($i)); ) while ($worker->collect()); $worker->shutdown();

위의 예에서는 새로운 $worker 객체에 대한 15개의 작업이 Worker::stack 메서드를 통해 스택에 푸시된 다음 푸시된 순서대로 처리됩니다. 위에 표시된 것처럼 Worker::collect 메서드는 작업 실행이 완료되자마자 작업을 정리하는 데 사용됩니다. 이를 통해 while 루프 내에서 Worker::shutdown 을 호출하기 전에 스택의 모든 작업이 완료되고 지워질 때까지 메인 스레드를 차단합니다. 작업자를 조기에 종료하면(즉, 완료해야 하는 작업이 아직 있는 동안) 모든 작업이 실행을 완료할 때까지 기본 스레드가 계속 차단됩니다. 단, 작업이 가비지 수집되지는 않습니다(메모리 누수가 수반됨).

Worker 클래스는 마지막 스택 작업을 제거하기 위한 Worker::unstack 및 실행 스택의 작업 수를 가져오기 위한 Worker::getStacked를 포함하여 작업 스택과 관련된 여러 가지 다른 메서드를 제공합니다. 작업자의 스택에는 실행해야 하는 작업만 포함됩니다. 스택의 작업이 완료되면 해당 작업은 제거되어 가비지 수집을 위해 별도의(내부) 스택에 배치됩니다(Worker::collect 메서드 사용).

여러 작업에서 스레드를 재사용하는 또 다른 방법은 스레드 풀(Pool 클래스를 통해)을 사용하는 것입니다. 스레드 풀은 작업자 그룹을 사용하여 작업을 실행할 수 있도록 합니다. 동시에, 동시성 요소(작동하는 풀 스레드 수)는 풀이 생성될 때 설정됩니다.

작업자 풀을 사용하도록 위의 예를 적용해 보겠습니다.

클래스 작업 확장 스레드( 개인 $value; 공용 함수 __construct(int $i) ( $this->value = $i; ) 공용 함수 run() ( usleep(250000); echo "작업: ($this->value) \n"; ) ) $pool = 새 풀(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $풀->종료();

작업자와 달리 풀을 사용할 때 몇 가지 눈에 띄는 차이점이 있습니다. 첫째, 풀은 수동으로 시작할 필요가 없으며 작업이 사용 가능해지면 즉시 작업 실행을 시작합니다. 둘째, 우리는 보내다풀에 대한 작업이 아닌 스택에 넣어. 또한 Pool 클래스는 Threaded에서 상속되지 않으므로 Worker와 달리 다른 스레드로 전달될 수 없습니다.

어떻게 좋은 연습작업자 및 풀의 경우 작업이 완료되는 즉시 항상 작업을 정리한 다음 수동으로 종료해야 합니다. Thread 클래스를 사용하여 생성된 스레드는 상위 스레드에도 연결되어야 합니다.

pthread 및 (불) 가변성

우리가 다룰 마지막 클래스는 pthreads v3에 새로 추가된 Volatile입니다. 불변성은 pthread에서 중요한 개념이 되었습니다. 불변성이 없으면 성능이 크게 저하되기 때문입니다. 따라서 기본적으로 Threaded 객체 자체인 Threaded 클래스의 속성은 이제 변경할 수 없으므로 초기 할당 후에는 덮어쓸 수 없습니다. 이러한 속성에 대한 명시적인 변경 가능성은 현재 선호되며 새로운 Volatile 클래스를 사용하여 계속 달성할 수 있습니다.

새로운 불변성 제한을 보여주는 예를 살펴보겠습니다.

클래스 작업은 Threaded를 확장합니다 // Threaded 클래스( public function __construct() ( $this->data = new Threaded(); // $this->data는 Threaded 클래스의 Threaded 속성이므로 덮어쓸 수 없습니다. ) ) $task = new class(new Task()) extends Thread ( // Thread가 Threaded 공용 함수를 확장하기 때문에 Threaded 클래스 __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // 속성이 Threaded 클래스의 Threaded 멤버이므로 유효하지 않습니다. ) );

반면 Volatile 클래스의 스레드 속성은 변경 가능합니다.

클래스 Task 확장 Volatile ( public function __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // 휘발성 클래스에 있으므로 유효합니다. ) ) $task = new class(new Task()) 확장 스레드 ( 공용 함수 __construct($vm) ( $this->휘발성Member = $vm; var_dump($this->휘발성Member->data); // object(stdClass)#4 (0) () // Volatile이 Threaded를 확장하므로 여전히 유효하지 않으므로 속성은 여전히 ​​Threaded 클래스의 Threaded 멤버입니다. $this->휘발성Member = new StdClass(); ) );

Volatile 클래스는 상위 Threaded 클래스에 의해 부과된 불변성을 재정의하여 Threaded 속성을 변경(및 unset())할 수 있는 기능을 제공하는 것을 볼 수 있습니다.

가변성과 Volatile 클래스에 대한 주제를 다루는 또 다른 토론 주제인 배열이 있습니다. pthread에서 배열은 Threaded 클래스의 속성에 할당될 때 자동으로 Volatile 객체로 캐스팅됩니다. 이는 여러 PHP 컨텍스트의 배열을 조작하는 것이 안전하지 않기 때문입니다.

몇 가지 사항을 더 잘 이해하기 위해 예제를 다시 살펴보겠습니다.

$배열 = ; $task = new class($array) 확장 Thread ( private $data; public function __construct(array $array) ( $this->data = $array; ) public function run() ( $this->data = 4; $ this->data = 5; print_r($this->data); ) ); $task->start() && $task->join(); /* 출력: 휘발성 개체 ( => 1 => 2 => 3 => 4 => 5) */

Volatile 객체는 (위에 표시된 것처럼) subset() 연산자와 같은 배열 작업을 지원하기 때문에 배열인 것처럼 처리될 수 있습니다. 그러나 Volatile 클래스는 array_pop, array_shift와 같은 기본 배열 함수를 지원하지 않습니다. 대신 Threaded 클래스는 내장 메서드와 같은 작업을 제공합니다.

데모로:

$data = 새 클래스 확장 Volatile( public $a = 1; public $b = 2; public $c = 3; ); var_dump($data); var_dump($data->pop()); var_dump($data->shift()); var_dump($data); /* 출력: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) object(class@anonymous)#1 (1) ( ["b"]=> int(2) ) */

지원되는 다른 작업으로는 Threaded::chunk 및 Threaded::merge가 있습니다.

동기화

이 기사의 마지막 섹션에서는 pthread의 동기화에 대해 살펴보겠습니다. 동기화는 공유 리소스에 대한 액세스를 제어할 수 있는 방법입니다.

예를 들어 간단한 카운터를 구현해 보겠습니다.

$counter = 새 클래스 확장 Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $counter->시작(); for ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // 10에서 20까지의 숫자를 인쇄합니다.

동기화를 사용하지 않으면 출력이 결정적이지 않습니다. 여러 스레드가 제어된 액세스 없이 동일한 변수에 쓰기 때문에 업데이트가 손실됩니다.

타이밍을 추가하여 올바른 출력 20을 얻을 수 있도록 이 문제를 수정해 보겠습니다.

$counter = 새 클래스 확장 Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $counter->시작(); $counter->synchronized(function ($counter) ( for ($i = 0; $i i; ) ), $counter); $counter->join(); var_dump($counter->i); // 정수(20)

동기화된 코드 블록은 Threaded::wait 및 Threaded::notify(또는 Threaded::notifyAll) 메서드를 사용하여 서로 통신할 수도 있습니다.

다음은 두 개의 동기화된 while 루프의 대체 증분입니다.

$counter = 새 클래스 확장 Thread ( public $cond = 1; public function run() ( $this->synchronized(function () ( for ($i = 0; $i inform(); if ($this->cond === 1) ( $this->cond = 2; $this->wait(); ) ) )); ) ); $counter->시작(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // 다른 쪽이 먼저 시작될 때까지 기다립니다 ) for ($i = 10; $i 통지(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->join(); /* 출력: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) int(6) int(16) int(7) int(17) int(8) int(18) int(9) int(19) */

Threaded::wait 호출에 추가 조건이 추가된 것을 확인할 수 있습니다. 이러한 조건은 알림을 받고 지정된 조건이 true 일 때 동기화된 콜백이 재개되도록 허용하므로 중요합니다. Threaded::notify가 호출될 때가 아닌 다른 곳에서 알림이 올 수 있기 때문에 이는 중요합니다. 따라서 Threaded::wait 메소드에 대한 호출이 조건에 포함되지 않은 경우 다음을 실행합니다. 거짓 모닝콜, 이로 인해 예측할 수 없는 코드 동작이 발생합니다.

결론

pthreads 패키지의 5가지 클래스(Threaded, Thread, Worker, Volatile, Pool)와 각 클래스의 사용 방법을 살펴보았습니다. 또한 pthread의 새로운 불변성 개념을 살펴보고 지원되는 동기화 기능에 대한 간략한 개요를 제공했습니다. 이러한 기본 사항을 갖추고 이제 실제 사례에서 pthread를 어떻게 사용할 수 있는지 살펴볼 수 있습니다! 이것이 다음 게시물의 주제가 될 것입니다.

다음 게시물의 번역에 관심이 있으시면 알려주세요. 소셜 미디어에 댓글을 남겨주세요. 네트워크를 구축하고, 동료 및 친구들과 게시물을 찬성하고 공유하세요.

  • 프로그램 작성,
  • 병렬 프로그래밍
  • 나는 최근에 pthread를 시도했고 기분 좋게 놀랐습니다. 이는 PHP에서 여러 실제 스레드로 작업할 수 있는 기능을 추가하는 확장입니다. 에뮬레이션도, 마법도, 가짜도 없습니다. 모든 것이 진짜입니다.



    나는 그런 일을 고려하고 있다. 신속하게 완료해야 하는 작업 풀이 있습니다. PHP에는 이 문제를 해결하기 위한 다른 도구가 있지만 여기서는 언급되지 않았습니다. 이 기사는 pthread에 관한 것입니다.



    pthread 란 무엇입니까?

    그게 다야! 글쎄, 거의 모든 것. 사실, 호기심 많은 독자를 당황하게 할 만한 것이 있습니다. 이 중 어느 것도 기본 옵션으로 컴파일된 표준 PHP에서는 작동하지 않습니다. 멀티스레딩을 즐기려면 PHP에서 ZTS(Zend Thread Safety)를 활성화해야 합니다.

    PHP 설정

    다음으로 ZTS를 사용한 PHP입니다. ZTS가 없는 PHP와 비교하여 실행 시간의 큰 차이(37.65초 대 265.05초)에 신경 쓰지 마십시오. PHP 설정을 일반화하려고 시도하지 않았습니다. 예를 들어 ZTS가 없는 경우 XDebug를 활성화했습니다.


    보시다시피, 2개의 쓰레드를 사용할 경우 선형 코드의 경우보다 프로그램 실행 속도가 약 1.5배 더 빨라집니다. 4개의 스레드를 사용하는 경우 - 3번.


    프로세서가 8코어임에도 불구하고 4개 이상의 스레드를 사용하면 프로그램 실행 시간이 거의 변하지 않은 것을 확인할 수 있습니다. 이는 내 프로세서에 4개의 물리적 코어가 있기 때문인 것 같습니다. 명확성을 위해 플레이트를 다이어그램 형식으로 표시했습니다.


    요약

    PHP에서는 pthreads 확장을 사용하여 멀티스레딩으로 매우 우아하게 작업하는 것이 가능합니다. 이로 인해 생산성이 눈에 띄게 증가합니다.

    태그:

    • PHP
    • pthread
    태그 추가

    나는 최근에 pthread를 시도했고 기분 좋게 놀랐습니다. 이는 PHP에서 여러 실제 스레드로 작업할 수 있는 기능을 추가하는 확장입니다. 에뮬레이션도, 마법도, 가짜도 없습니다. 모든 것이 진짜입니다.



    나는 그런 일을 고려하고 있다. 신속하게 완료해야 하는 작업 풀이 있습니다. PHP에는 이 문제를 해결하기 위한 다른 도구가 있지만 여기서는 언급되지 않았습니다. 이 기사는 pthread에 관한 것입니다.



    pthread 란 무엇입니까?

    그게 다야! 글쎄, 거의 모든 것. 사실, 호기심 많은 독자를 당황하게 할 만한 것이 있습니다. 이 중 어느 것도 기본 옵션으로 컴파일된 표준 PHP에서는 작동하지 않습니다. 멀티스레딩을 즐기려면 PHP에서 ZTS(Zend Thread Safety)를 활성화해야 합니다.

    PHP 설정

    다음으로 ZTS를 사용한 PHP입니다. ZTS가 없는 PHP와 비교하여 실행 시간의 큰 차이(37.65초 대 265.05초)에 신경 쓰지 마십시오. PHP 설정을 일반화하려고 시도하지 않았습니다. 예를 들어 ZTS가 없는 경우 XDebug를 활성화했습니다.


    보시다시피, 2개의 쓰레드를 사용할 경우 선형 코드의 경우보다 프로그램 실행 속도가 약 1.5배 더 빨라집니다. 4개의 스레드를 사용하는 경우 - 3번.


    프로세서가 8코어임에도 불구하고 4개 이상의 스레드를 사용하면 프로그램 실행 시간이 거의 변하지 않은 것을 확인할 수 있습니다. 이는 내 프로세서에 4개의 물리적 코어가 있기 때문인 것 같습니다. 명확성을 위해 플레이트를 다이어그램 형식으로 표시했습니다.


    요약

    PHP에서는 pthreads 확장을 사용하여 멀티스레딩으로 매우 우아하게 작업하는 것이 가능합니다. 이로 인해 생산성이 눈에 띄게 증가합니다.



    
    맨 위