parallel

parallel

PHP용 병렬 동시성 확장이에요. PHP 7.2.0 이상에서 동작하며, 스레드를 직접 만드는 대신 런타임·태스크·퓨처·채널·이벤트 같은 개념으로 병렬 코드를 구성합니다.

출처: parallel

본문

parallel은 PHP 7.2.0 이상에서 쓸 수 있는 병렬 동시성 확장입니다. parallel 1.2.0부터는 PHP 8.0.0 이상이 필요해요.

아래에는 parallel의 핵심 개념들을 간단히 설명합니다. 더 자세한 내용은 매뉴얼의 해당 섹션에서 확인할 수 있어요.

Runtime

parallel\Runtime은 PHP 인터프리터 스레드를 나타냅니다. parallel\Runtime은 선택적인 부트스트랩 파일로 구성할 수 있는데, 이 파일은 parallel\Runtime::__construct()에 전달됩니다. 보통 오토로더나 다른 프리로딩 루틴이에요. 부트스트랩 파일은 어떤 태스크가 실행되기 전에 먼저 포함됩니다.

구성된 후에는 parallel\Runtime이 닫히거나(close), 종료되거나(kill), PHP 객체의 일반적인 스코프 규칙에 따라 파괴될 때까지 계속 사용할 수 있어요. parallel\Runtime::run()으로 병렬로 실행할 태스크를 예약할 수 있습니다.

parallel\Runtime은 FIFO 스케줄을 사용해서, 태스크는 예약된 순서대로 실행됩니다.

함수형 API

parallel은 parallel\Runtime 위에 더 높은 수준의 함수형 API를 구현합니다. 병렬 코드를 실행하는 단일 함수 진입점을 제공하는데, 자동 스케줄링과 함께 동작하는 parallel\run()이 바로 그것이에요.

Task

태스크(task)는 병렬 실행을 위해 준비된 클로저(Closure)를 말합니다. 클로저는 중첩 클로저를 포함해 거의 모든 명령을 담을 수 있어요. 다만 태스크 안에서 금지되는 명령이 몇 가지 있습니다.

  • yield
  • 참조로 사용(use by-reference)
  • 클래스 선언(declare class)
  • 이름 있는 함수 선언(declare named function)

중첩 클로저는 yield를 하거나 참조로 사용할 수 있지만, 클래스나 이름 있는 함수 선언은 포함하면 안 됩니다. 반면 태스크가 포함하는 파일 안에서는 어떤 명령도 금지되지 않아요.

Future

parallel\Future는 태스크의 반환값에 접근하는 데 쓰이며, 태스크를 취소하는 API도 노출합니다.

Channel

태스크는 인자로 예약되고, 어휘 스코프 변수(값 전달)를 사용하며 반환값(parallel\Future를 통해)을 돌려줄 수 있습니다. 하지만 이는 단방향 통신만 허용해요. 데이터를 태스크로 보내고 태스크에서 가져올 수는 있지만, 태스크 간 양방향 통신은 안 된다는 뜻입니다.

parallel\Channel API는 태스크 간 양방향 통신을 가능하게 해줍니다. parallel\Channel은 태스크 간의 소켓 같은 연결이라, 데이터를 주고받는 데 사용합니다.

Events

parallel\Events API는 네이티브 느낌의(Traversable) 이벤트 루프와 parallel\Events::poll() 메서드를 구현합니다. 채널과 퓨처의 집합을 함께 다룰 수 있게 해주죠.

코더가 이벤트 루프에 채널과 퓨처를 추가하고, 필요하면 쓰기용 입력을 parallel\Events::setInput()으로 설정한 뒤 foreach로 진입합니다. parallel은 객체가 사용 가능해지면 그 객체를 읽고 쓰면서 발생한 연산을 설명하는 parallel\Events\Event 객체를 생산합니다.

더 알아보기