Documentación offline PHP master

La clase Swoole\Coroutine\Lock

master Ver versión oficial en línea Licencia CC-BY-3.0Descargado el 2026-08-02

En esta página

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.

[!WARNING] 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.

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

Sinopsis de la clase#

Swoole\Coroutine\Lock

Swoole\Coroutine\Lock

Métodos

Ejemplos#

Uso básico

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