The Swoole\Coroutine\Lock class

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

Introducción

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.

Advertencia

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.

Advertencia

El bloqueo y desbloqueo deben realizarse en la misma corrutina, de lo contrario se romperán las condiciones estáticas.

Sinopsis de la Clase

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

Ejemplos

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

Tabla de contenidos

add a note

User Contributed Notes

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