Locker verrou de coroutine
Locker est un verrou en mémoire utilisé pour la synchronisation entre coroutines, souvent utilisé pour mettre en file d'attente l'accès à une ressource critique dans une coroutine. Par exemple, si un composant de base de données n'a pas de pool de connexions, on peut utiliser Locker pour mettre en file d'attente l'utilisation de ce composant, évitant ainsi que plusieurs coroutines utilisent simultanément la même ressource de connexion, ce qui pourrait entraîner des anomalies dans les données.
Conseil
Cette fonctionnalité nécessite workerman>=5.1.0
Remarque
- Locker prend en charge Swoole/Swow/Fiber/Select/Event drivé
- Locker est utilisé pour un accès mutuel en file d'attente entre différentes coroutines au sein d'un même processus, sans interférer entre les processus et les processus.
<?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; // Ou Swow::class ou Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
static $redis;
if (!$redis) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
}
// Évitez que plusieurs coroutines utilisent la même connexion, ce qui entraîne l'erreur "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();
Description de l'interface
interface LockerInterface
{
/**
* Acquérir le verrou
*/
public static function lock(string $key): bool
/**
* Libérer le verrou
*/
public static function unlock(string $key): bool
}