Locker корутива блокировка
Locker — это блокировка памяти, используемая для синхронизации между корутинами, обычно используется для очередного доступа к определенному критическому ресурсу в корутине, например, если какой-либо компонент базы данных не использует пул подключений, то можно использовать Locker для очереди доступа к этому компоненту, избегая тем самым возникновения аномалий данных из-за одновременного доступа нескольких корутин к одному и тому же ресурсу подключения.
Подсказка
Эта функция требует workerman>=5.1.0
Внимание
- Locker поддерживает Swoole/Swow/Fiber/Select/Event-драйв
- Locker предназначен для очередного взаимного доступа между разными корутинами в одном процессе, процессы между собой не взаимодействуют
<?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; // Или Swow::class или Fiber::class
$worker->onMessage = function (TcpConnection $connection, Request $request) {
static $redis;
if (!$redis) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
}
// Избегайте одновременного использования одного и того же соединения несколькими корутинами, что может вызвать ошибку "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();
Описание интерфейса
interface LockerInterface
{
/**
* Захватить блокировку
*/
public static function lock(string $key): bool
/**
* Освободить блокировку
*/
public static function unlock(string $key): bool
}