suspend
(PHP 8.6+, True Async 1.0)
suspend() — Sospende l’esecuzione della coroutine corrente
Descrizione
suspend: void
Sospende l’esecuzione della coroutine corrente e cede il controllo allo scheduler. L’esecuzione della coroutine verrà ripresa in seguito quando lo scheduler deciderà di eseguirla.
suspend() è una funzione fornita dall’estensione True Async.
Parametri
Questo costrutto non ha parametri.
Valori di ritorno
La funzione non restituisce un valore.
Esempi
Esempio #1 Uso base di suspend
<?php
use function Async\spawn;
spawn(function() {
echo "Prima di suspend\n";
suspend();
echo "Dopo suspend\n";
});
echo "Codice principale\n";
?>
Output:
Prima di suspend
Codice principale
Dopo suspend
Esempio #2 Suspend multipli
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 3; $i++) {
echo "Iterazione $i\n";
suspend();
}
});
echo "Coroutine avviata\n";
?>
Output:
Iterazione 1
Coroutine avviata
Iterazione 2
Iterazione 3
Esempio #3 Multitasking cooperativo
<?php
use function Async\spawn;
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Coroutine A: $i\n";
suspend(); // Dai alle altre coroutine la possibilità di eseguire
}
});
spawn(function() {
for ($i = 1; $i <= 5; $i++) {
echo "Coroutine B: $i\n";
suspend();
}
});
?>
Output:
Coroutine A: 1
Coroutine B: 1
Coroutine A: 2
Coroutine B: 2
Coroutine A: 3
Coroutine B: 3
...
Esempio #4 Cessione esplicita del controllo
<?php
use function Async\spawn;
spawn(function() {
echo "Inizio lavoro lungo\n";
for ($i = 0; $i < 1000000; $i++) {
// Calcoli
if ($i % 100000 === 0) {
suspend(); // Cedi periodicamente il controllo
}
}
echo "Lavoro completato\n";
});
spawn(function() {
echo "Anche un'altra coroutine sta lavorando\n";
});
?>
Esempio #5 suspend da funzioni annidate
suspend() funziona da qualsiasi profondità di chiamata — non ha bisogno di essere chiamato direttamente dalla coroutine:
<?php
use function Async\spawn;
function nestedSuspend() {
echo "Funzione annidata: prima di suspend\n";
suspend();
echo "Funzione annidata: dopo suspend\n";
}
function deeplyNested() {
echo "Chiamata profonda: inizio\n";
nestedSuspend();
echo "Chiamata profonda: fine\n";
}
spawn(function() {
echo "Coroutine: prima della chiamata annidata\n";
deeplyNested();
echo "Coroutine: dopo la chiamata annidata\n";
});
spawn(function() {
echo "Altra coroutine: in esecuzione\n";
});
?>
Output:
Coroutine: prima della chiamata annidata
Chiamata profonda: inizio
Funzione annidata: prima di suspend
Altra coroutine: in esecuzione
Funzione annidata: dopo suspend
Chiamata profonda: fine
Coroutine: dopo la chiamata annidata
Esempio #6 suspend in un ciclo di attesa
<?php
use function Async\spawn;
$ready = false;
spawn(function() use (&$ready) {
// Attendi finché il flag diventa true
while (!$ready) {
suspend(); // Cedi il controllo
}
echo "Condizione soddisfatta!\n";
});
spawn(function() use (&$ready) {
echo "Preparazione...\n";
Async\sleep(2000);
$ready = true;
echo "Pronto!\n";
});
?>
Output:
Preparazione...
Pronto!
Condizione soddisfatta!
Note
Nota:
suspend()è una funzione. Chiamarla comesuspend(senza parentesi) non è corretto.
Nota: In TrueAsync, tutto il codice in esecuzione viene trattato come una coroutine, quindi
suspend()può essere chiamato ovunque (incluso lo script principale).
Nota: Dopo aver chiamato
suspend(), l’esecuzione della coroutine non riprenderà immediatamente, ma quando lo scheduler deciderà di eseguirla. L’ordine di ripresa delle coroutine non è garantito.
Nota: Nella maggior parte dei casi, l’uso esplicito di
suspend()non è necessario. Le coroutine vengono sospese automaticamente durante le operazioni di I/O (lettura di file, richieste di rete, ecc.).
Nota: L’uso di
suspend()in cicli infiniti senza operazioni di I/O può portare a un elevato utilizzo della CPU. È possibile utilizzare ancheAsync\timeout().
Changelog
| Versione | Descrizione |
|---|---|
| 1.0.0 | Aggiunta la funzione suspend() |