Locker Corso di Blocco
Locker è un blocco in memoria utilizzato per la sincronizzazione tra coroutine, comunemente usato per accedere in coda a determinate risorse critiche all'interno di coroutine. Ad esempio, se un componente del database non ha configurato un pool di connessioni, si può utilizzare Locker per accedere in coda a quel componente, evitando anomalie nei dati causate da più coroutine che utilizzano simultaneamente la stessa risorsa di connessione.
Suggerimento
Questa funzionalità richiede workerman>=5.1.0
Attenzione
- Locker supporta Swoole/Swow/Fiber/Select/Event-driven.
- Locker è progettato per la mutua esclusione nell'accesso a una risorsa tra diverse coroutine all'interno dello stesso processo, non influenzando i processi tra di loro.
<?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; // Oppure 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);
}
// Evita che più coroutine utilizzino la stessa connessione, causando errori come "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();
Descrizione dell'interfaccia
interface LockerInterface
{
/**
* Acquisire il blocco
*/
public static function lock(string $key): bool
/**
* Rilasciare il blocco
*/
public static function unlock(string $key): bool
}