pthreads 소개

pthreads는 PHP에서 멀티 스레딩에 필요한 모든 도구를 제공하는 객체 지향 API입니다. PHP 응용 프로그램은 스레드, Workers 및 스레드 개체를 생성, 읽기, 쓰기, 실행 및 동기화할 수 있습니다.

경고 이 확장은 유지 관리되지 않고 죽은 것으로 간주됩니다.

대신 병렬 사용을 고려하십시오.

경고 pthreads 확장은 웹 서버 환경에서 사용할 수 없습니다. 따라서 PHP의 스레딩은 CLI 기반 애플리케이션으로만 제한됩니다.

경고 pthreads(v3)는 PHP 7.2 이상에서만 사용할 수 있습니다. 이는 ZTS 모드가 7.0 및 7.1에서 안전하지 않기 때문입니다.

Threaded 클래스는 pthread가 작동할 수 있도록 하는 기능의 기초를 형성합니다. 프로그래머를 위한 동기화 메서드와 몇 가지 유용한 인터페이스를 제공합니다.

Thread 클래스를 사용하면 단순히 확장하고 run 메서드를 구현하여 스레드를 생성할 수 있습니다. 스레드에 대한 참조가 있는 모든 컨텍스트에서 모든 멤버를 쓰고 읽을 수 있습니다. 모든 컨텍스트는 모든 public 및 protected 메서드를 실행할 수도 있습니다. 실행 메소드의 본문은 구현의 Thread::start() 메소드가 이를 생성한 컨텍스트에서 호출될 때 별도의 스레드에서 실행됩니다. 스레드를 생성하는 컨텍스트만 스레드를 시작하고 결합할 수 있습니다.

Worker 클래스는 지속 상태를 가지며 객체가 범위를 벗어나거나 명시적으로 종료될 때까지(Worker::shutdown()을 통해) Thread::start()(상속된 메서드)에 대한 호출에서 사용할 수 있습니다. Worker 개체에 대한 참조가 있는 모든 컨텍스트는 Worker에 작업을 스택할 수 있으며(Worker::stack()을 통해) 이러한 작업은 별도의 스레드에서 Worker에 의해 실행됩니다. Worker 개체의 run 메서드는 작업자 스택의 개체보다 먼저 실행되므로 실행할 개체에 필요한 리소스를 초기화할 수 있습니다.

Pool 클래스는 Worker그룹을 생성하여 그들 사이에 Threaded 객체를 배포하는 데 사용됩니다. PHP 애플리케이션에서 다중 스레드를 사용하는 가장 쉽고 효율적인 방법입니다.

주의 Pool 클래스는 Threaded 클래스를 확장하지 않으므로 풀 기반 객체는 일반적인 PHP 객체로 간주됩니다. 따라서 해당 인스턴스를 다른 컨텍스트에서 공유해서는 안 됩니다.

Volatile 클래스는 pthreads v3의 새로운 기능입니다. Threaded 클래스의 변경 가능한 Threaded 속성을 나타내는 데 사용됩니다(이제는 기본적으로 변경할 수 없으므로). 또한 Threaded 컨텍스트에서 PHP 배열을 저장하는 데 사용됩니다.

스레딩할 때 동기화는 중요한 기능입니다. pthreads가 생성하는 모든 객체는 Threaded::wait()Threaded::notify()의 (자바 프로그래머에게 친숙한) 동기화 기능을 내장하고 있습니다. 객체에서 Threaded::wait()를 호출하면 컨텍스트가 다른 컨텍스트가 동일한 객체에서 Threaded::notify()를 호출할 때까지 대기하게 됩니다. 이 메커니즘은 PHP에서 Threaded 개체 간의 강력한 동기화를 허용합니다.

주의 애플리케이션의 다중 스레드 부분에서 사용하기 위한 모든 개체는 Threaded를 확장해야 합니다.

데이터 저장소: 경험상 직렬화할 수 있는 모든 데이터 유형은 스레드 개체의 구성원으로 사용할 수 있으며 스레드 개체에 대한 참조가 있는 모든 컨텍스트에서 읽고 쓸 수 있습니다. 모든 유형의 데이터가 직렬로 저장되는 것은 아니며 기본 유형은 실제 형식으로 저장됩니다. 스레드되지 않은 복잡한 유형, 배열 및 개체는 직렬로 저장됩니다. 참조가 있는 모든 컨텍스트에서 스레드 개체에 읽고 쓸 수 있습니다. 스레드 개체를 제외하고 스레드 개체의 구성원을 설정하는 데 사용되는 참조는 스레드 개체의 참조와 분리됩니다. 스레드 개체에 대한 참조가 있는 모든 컨텍스트에서 언제든지 스레드 개체에서 동일한 데이터를 직접 읽을 수 있습니다.

정적 멤버: 새 컨텍스트가 생성되면( Thread 또는 Worker ) 일반적으로 복사되지만 내부 상태의 리소스 및 개체는 무효화됩니다(안전상의 이유로). 이를 통해 일종의 스레드 로컬 저장소로 작동할 수 있습니다. 예를 들어 컨텍스트를 시작할 때 정적 멤버에 데이터베이스 서버에 대한 연결 정보가 포함된 클래스와 연결 자체에는 연결이 아닌 단순 연결 정보만 복사됩니다. 새 컨텍스트가 연결을 생성한 컨텍스트와 동일한 방식으로 연결을 시작하도록 허용하고 원래 컨텍스트에 영향을 주지 않고 동일한 위치에 연결을 저장합니다.

주의 print_r, var_dump 및 기타 개체 디버그 함수가 실행될 때 재귀 방지가 포함되지 않습니다.

메모: 리소스: PHP에서 리소스를 정의하는 확장 및 기능은 이러한 종류의 환경에 대해 완전히 준비되지 않았습니다. pthreads는 리소스가 컨텍스트 간에 공유되도록 규정하지만 대부분의 리소스 유형에서는 안전하지 않은 것으로 간주되어야 합니다. 컨텍스트 간에 리소스를 공유할 때는 각별한 주의와 주의가 필요합니다.

주의 pthread가 실행되는 환경에서는 안정적인 환경을 제공하기 위해 몇 가지 제한 사항이 필요합니다.