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
}