Locker Corutina Bloqueo
Locker es un tipo de bloqueo en memoria utilizado para la sincronización entre corutinas. Se utiliza comúnmente para hacer cola en el acceso a ciertos recursos críticos, por ejemplo, si un componente de base de datos no tiene un pool de conexiones, se puede utilizar Locker para hacer cola en el uso de dicho componente, evitando así que múltiples corutinas utilicen el mismo recurso de conexión al mismo tiempo, lo que puede provocar excepciones de datos.
Sugerencia
Esta característica requiere workerman>=5.1.0
Nota
- Locker soporta Swoole/Swow/Fiber/Select/Event driven
- Locker es para el acceso mutuo de cola entre diferentes corutinas en un mismo proceso, los procesos no se afectan entre sí.
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine\Locker;
use Workerman\Events\Swoole;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8001');
$worker->eventLoop = Swoole::class; // O Swow::class o Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
static $redis;
if (!$redis) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
}
// Evitar que múltiples corutinas utilicen la misma conexión y causen errores como "Socket#10 has already been bound to another coroutine"
Locker::lock('redis');
$time = $redis->time();
Locker::unlock('redis');
$connection->send(json_encode($time));
};
Worker::runAll();
Descripción de la interfaz
interface LockerInterface
{
/**
* Bloquear
*/
public static function lock(string $key): bool
/**
* Desbloquear
*/
public static function unlock(string $key): bool
}