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
}