컴포넌트ThreadPool::cancel()

ThreadPool::cancel()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::cancel(): void

풀의 강제 종료를 시작합니다. cancel()이 호출된 후:

  • 이후의 모든 submit() 호출은 즉시 Async\ThreadPoolException을 던집니다.
  • 큐에서 대기 중인 작업(아직 워커가 가져가지 않은)은 즉시 거부됩니다 — 해당하는 Future 객체는 ThreadPoolException(코루틴 모드 coroutine: true에서는 CancellationException)과 함께 거부 상태로 전환됩니다.
  • 일반 모드(coroutine: false)에서는 이미 워커 스레드에서 실행 중인 작업이 현재 작업의 완료까지 실행됩니다 — OS 스레드 내부의 PHP 코드를 강제로 중단하는 것은 불가능합니다.
  • coroutine: true 모드에서는 진행 중인 작업이 실제로 cancel됩니다 (TrueAsync 0.7.0부터): 채널이 닫히기 전에 원자적 cancel_requested 플래그가 설정되고, 워커가 ZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false)을 호출하며, AFTER_MAIN이 실행 중인 모든 작업의 자식 scope를 연쇄적으로 cancel합니다.
  • 워커는 현재 작업을 마치는 즉시 중지하며 큐에서 새 작업을 가져오지 않습니다.

큐에 있는 모든 작업이 완료될 때까지 기다리는 정상적인 종료를 원한다면 close()를 사용하세요.

반환값

void

예제

예제 #1 큐에 작업이 있을 때 강제 취소

php
<?php

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

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

    // 워커 2개에 걸쳐 8개의 작업으로 큐를 채웁니다
    $futures = [];
    for ($i = 0; $i < 8; $i++) {
        $futures[] = $pool->submit(function() use ($i) {
            $t = microtime(true);
            while (microtime(true) - $t < 0.2) {}
            return $i;
        });
    }

    // 즉시 취소 — 큐에 있는 작업들은 거부됩니다
    $pool->cancel();

    $done = 0;
    $cancelled = 0;
    foreach ($futures as $f) {
        try {
            await($f);
            $done++;
        } catch (ThreadPoolException $e) {
            $cancelled++;
        }
    }

    echo "done:      $done\n";      // 2  (cancel() 호출 시 이미 실행 중이었던 것)
    echo "cancelled: $cancelled\n"; // 6  (아직 큐에 있었던 것)
});

참고