La class Swoole\Coroutine\Lock

(No version information available, might only be in Git)

Introduction

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.

Avertissement

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.

Avertissement

Verrouiller et déverrouiller doivent être effectués dans la même coroutine, sinon cela rompra les conditions statiques.

Synopsis de la classe

class Swoole\Coroutine\Lock {
/* Méthodes */
public __construct(): void
public lock(): bool
public trylock(): bool
public unlock(): bool
}

Exemples

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();
});

Sommaire

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top