suspend

(PHP 8.6+, True Async 1.0)

suspend() — 현재 코루틴의 실행을 일시 중단합니다

설명

suspend: void

현재 코루틴의 실행을 일시 중단하고 스케줄러에 제어를 양보합니다. 코루틴의 실행은 스케줄러가 실행을 결정하면 나중에 재개됩니다.

suspend()는 True Async 확장이 제공하는 함수입니다.

매개변수

이 구문에는 매개변수가 없습니다.

반환 값

이 함수는 값을 반환하지 않습니다.

예제

예제 #1 suspend의 기본 사용법

<?php
use function Async\spawn;

spawn(function() {
    echo "Before suspend\n";
    suspend();
    echo "After suspend\n";
});

echo "Main code\n";
?>

출력:

Before suspend
Main code
After suspend

예제 #2 다중 suspend

<?php
use function Async\spawn;

spawn(function() {
    for ($i = 1; $i <= 3; $i++) {
        echo "Iteration $i\n";
        suspend();
    }
});

echo "Coroutine started\n";
?>

출력:

Iteration 1
Coroutine started
Iteration 2
Iteration 3

예제 #3 협력적 멀티태스킹

<?php
use function Async\spawn;

spawn(function() {
    for ($i = 1; $i <= 5; $i++) {
        echo "Coroutine A: $i\n";
        suspend(); // 다른 코루틴에 실행 기회를 줍니다
    }
});

spawn(function() {
    for ($i = 1; $i <= 5; $i++) {
        echo "Coroutine B: $i\n";
        suspend();
    }
});
?>

출력:

Coroutine A: 1
Coroutine B: 1
Coroutine A: 2
Coroutine B: 2
Coroutine A: 3
Coroutine B: 3
...

예제 #4 명시적 제어 양보

<?php
use function Async\spawn;

spawn(function() {
    echo "Starting long work\n";

    for ($i = 0; $i < 1000000; $i++) {
        // 계산

        if ($i % 100000 === 0) {
            suspend(); // 주기적으로 제어를 양보합니다
        }
    }

    echo "Work completed\n";
});

spawn(function() {
    echo "Other coroutine is also working\n";
});
?>

예제 #5 중첩된 함수에서의 suspend

suspend()는 모든 호출 깊이에서 동작합니다 — 코루틴에서 직접 호출할 필요가 없습니다:

<?php
use function Async\spawn;

function nestedSuspend() {
    echo "Nested function: before suspend\n";
    suspend();
    echo "Nested function: after suspend\n";
}

function deeplyNested() {
    echo "Deep call: start\n";
    nestedSuspend();
    echo "Deep call: end\n";
}

spawn(function() {
    echo "Coroutine: before nested call\n";
    deeplyNested();
    echo "Coroutine: after nested call\n";
});

spawn(function() {
    echo "Other coroutine: working\n";
});
?>

출력:

Coroutine: before nested call
Deep call: start
Nested function: before suspend
Other coroutine: working
Nested function: after suspend
Deep call: end
Coroutine: after nested call

예제 #6 대기 루프에서의 suspend

<?php
use function Async\spawn;

$ready = false;

spawn(function() use (&$ready) {
    // 플래그가 true가 될 때까지 대기합니다
    while (!$ready) {
        suspend(); // 제어 양보
    }

    echo "Condition met!\n";
});

spawn(function() use (&$ready) {
    echo "Preparing...\n";
    Async\sleep(2000);
    $ready = true;
    echo "Ready!\n";
});
?>

출력:

Preparing...
Ready!
Condition met!

참고

참고: suspend()는 함수입니다. suspend(괄호 없이) 호출하는 것은 잘못된 사용입니다.

참고: TrueAsync에서 실행 중인 모든 코드는 코루틴으로 취급되므로, suspend()는 메인 스크립트를 포함하여 어디서든 호출할 수 있습니다.

참고: suspend() 호출 후, 코루틴 실행은 즉시 재개되지 않고 스케줄러가 실행을 결정할 때 재개됩니다. 코루틴 재개 순서는 보장되지 않습니다.

참고: 대부분의 경우 suspend()의 명시적 사용은 필요하지 않습니다. 코루틴은 I/O 작업(파일 읽기, 네트워크 요청 등)을 수행할 때 자동으로 일시 중단됩니다.

참고: I/O 작업 없는 무한 루프에서 suspend()를 사용하면 높은 CPU 사용률이 발생할 수 있습니다. Async\timeout()을 사용할 수도 있습니다.

변경 이력

버전 설명
1.0.0 suspend() 함수가 추가되었습니다

같이 보기