(No version information available, might only be in Git)
Swoole 6.0.1 introdujo un bloqueo de corrutina que admite el uso compartido entre procesos e hilos. Este bloqueo está diseñado con un comportamiento no bloqueante y permite una sincronización eficiente de corrutinas en entornos multiproceso y multihilo.
Cuando se compila con la opción --enable-iouring
y el kernel de Linux admite
la característica io_uring futex
, el bloqueo de corrutina de Swoole implementa
la sincronización usando io_uring futex
. En este caso, las corrutinas esperan
las activaciones del bloqueo usando un mecanismo de cola eficiente, mejorando significativamente el rendimiento.
Sin io_uring futex
, el bloqueo de corrutina recurre a un mecanismo de retroceso
exponencial, donde el tiempo de espera aumenta en 2^n milisegundos (siendo n el número de fallos)
después de cada intento fallido de adquirir el bloqueo. Aunque este enfoque evita la espera activa,
introduce una carga adicional de programación de CPU y latencia.
El bloqueo de corrutina es reentrante, lo que permite a la corrutina que actualmente lo posee realizar múltiples operaciones de bloqueo de manera segura.
No cree bloqueos en funciones de retrollamada como onReceive
, ya que esto causará
un crecimiento continuo de la memoria y llevará a fugas de memoria.
El bloqueo y desbloqueo deben realizarse en la misma corrutina, de lo contrario se romperán las condiciones estáticas.
Ejemplo #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(); // Espera a que la corrutina que lo posee lo desbloquee
sleep(1);
$lock->unlock();
$waitGroup->done();
});
echo 'El bloqueo no bloquea el proceso';
$waitGroup->wait();
});