(No version information available, might only be in Git)
Swoole 6.0.1 a introduit un verrou de coroutine qui prend en charge le partage entre processus et thread. Ce verrou est conçu pour un comportement non-bloquant et permet une synchronisation efficace des coroutines dans des environnements multi-processus et multi-thread.
Lorsque compilé avec l'option --enable-iouring
et que le noyau Linux prend en charge
la fonctionnalité io_uring futex
, le verrou de coroutine de Swoole utilise
io_uring futex
pour la synchronisation. Dans ce cas, les coroutines attendent pour la fin de vérrouillage
en utilisant un mécanisme de mise en file d'attente efficace, ce qui améliore considérablement les performances.
Sans io_uring futex
, le verrou de coroutine utilise un mécanisme de sommeil avec
un backoff exponentiel, où le temps d'attente augmente de 2^n millisecondes (n étant le nombre d'échecs)
après chaque tentative échouée d'acquérir le verrou. Bien que cette approche évite l'attente active, elle introduit
une surcharge supplémentaire de planification CPU et une latence accrue.
Le verrou de coroutine est conçu pour être utilisé dans des environnements où les coroutines peuvent effectuer en toute sécurité plusieurs opérations de verrouillage.
Ne pas créer de verrou dans une fonction de rappel tel que onReceive
, car cela entraînera
une croissance continue de la mémoire et conduira à des fuites de mémoire.
Verrouiller et déverrouiller doivent être effectués dans la même coroutine, sinon cela rompra les conditions statiques.
Exemple #1 Basic usage
<?php
use Swoole\Coroutine\Lock;
use Swoole\Coroutine\WaitGroup;
use function Swoole\Coroutine\go;
use function Swoole\Coroutine\run;
$lock = new Lock();
$waitGroup = new WaitGroup();
run(function() use ($lock, $waitGroup) {
go(function() use ($lock, $waitGroup) {
$waitGroup->add();
$lock->lock();
sleep(1);
$lock->unlock();
$waitGroup->done();
});
go(function() use ($lock, $waitGroup) {
$waitGroup->add();
$lock->lock(); // Attente la coroutine qui détient le verrou
sleep(1);
$lock->unlock();
$waitGroup->done();
});
echo 'Lock does not block the process';
$waitGroup->wait();
});