컴포넌트ThreadPool::submit()

ThreadPool::submit()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::submit(callable $task, mixed ...$args): Async\Future

풀의 내부 큐에 작업을 추가합니다. 유휴 워커가 작업을 가져가 실행하고, 반환된 Future를 반환값으로 해결합니다. 큐가 가득 찬 경우, 슬롯이 열릴 때까지 호출 코루틴이 일시 중단됩니다.

매개변수

매개변수타입설명
$taskcallable워커 스레드에서 실행할 callable. 워커로 깊은 복사됩니다 — 객체나 리소스를 캡처하는 클로저는 Async\ThreadTransferException을 던집니다.
...$argsmixed$task에 전달할 추가 인수. 역시 깊은 복사됩니다.

반환값

Async\Future$task의 반환값으로 해결되거나, $task가 던진 예외로 거부됩니다.

예외

  • Async\ThreadPoolExceptionclose() 또는 cancel()을 통해 풀이 닫힌 경우 즉시 던져집니다.
  • Async\ThreadTransferException$task 또는 어떤 인수가 전송을 위해 직렬화될 수 없는 경우(예: stdClass, PHP 참조, 리소스).

예제

예제 #1 기본 submit과 await

php
<?php

use Async\ThreadPool;
use function Async\spawn;
use function Async\await;

spawn(function() {
    $pool = new ThreadPool(workers: 2);

    $future = $pool->submit(function(int $n) {
        $sum = 0;
        for ($i = 0; $i < $n; $i++) {
            $sum += $i;
        }
        return $sum;
    }, 1_000_000);

    echo await($future), "\n"; // 499999500000

    $pool->close();
});

예제 #2 작업에서 던진 예외 처리

php
<?php

use Async\ThreadPool;
use function Async\spawn;
use function Async\await;

spawn(function() {
    $pool = new ThreadPool(workers: 2);

    $future = $pool->submit(function() {
        throw new \RuntimeException('something went wrong in the worker');
    });

    try {
        await($future);
    } catch (\RuntimeException $e) {
        echo "Caught: ", $e->getMessage(), "\n";
        // Caught: something went wrong in the worker
    }

    $pool->close();
});

예제 #3 여러 작업 병렬 제출

php
<?php

use Async\ThreadPool;
use function Async\spawn;
use function Async\await;

spawn(function() {
    $pool = new ThreadPool(workers: 4);

    $futures = [];
    for ($i = 1; $i <= 8; $i++) {
        $futures[] = $pool->submit(function() use ($i) {
            return $i * $i;
        });
    }

    foreach ($futures as $f) {
        echo await($f), "\n";
    }

    $pool->close();
});

참고