跳到内容

Semaphore 组件

编辑此页

Semaphore 组件管理信号量,这是一种为共享资源提供独占访问的机制。

安装

1
$ composer require symfony/semaphore

注意

如果在 Symfony 应用程序之外安装此组件,则必须在代码中引入 vendor/autoload.php 文件,以启用 Composer 提供的类自动加载机制。阅读这篇文章以了解更多详情。

用法

在计算机科学中,信号量是一种变量或抽象数据类型,用于控制并发系统(如多任务操作系统)中多个进程对公共资源的访问。 与的主要区别在于,信号量允许多个进程访问资源,而锁只允许一个进程访问。

使用 SemaphoreFactory 类创建信号量,这反过来又需要另一个类来管理存储。

1
2
3
4
5
6
7
8
use Symfony\Component\Semaphore\SemaphoreFactory;
use Symfony\Component\Semaphore\Store\RedisStore;

$redis = new Redis();
$redis->connect('172.17.0.2');

$store = new RedisStore($redis);
$factory = new SemaphoreFactory($store);

通过调用 createSemaphore() 方法来创建信号量。它的第一个参数是表示锁定资源的任意字符串。它的第二个参数是允许的最大进程数。然后,调用 acquire() 方法将尝试获取信号量。

1
2
3
4
5
6
7
8
9
// ...
$semaphore = $factory->createSemaphore('pdf-invoice-generation', 2);

if ($semaphore->acquire()) {
    // The resource "pdf-invoice-generation" is locked.
    // Here you can safely compute and generate the invoice.

    $semaphore->release();
}

如果无法获取信号量,该方法将返回 falseacquire() 方法可以安全地重复调用,即使信号量已被获取。

注意

与其他实现不同,Semaphore 组件即使为同一资源创建信号量实例,也会区分它们。如果一个信号量必须被多个服务使用,它们应该共享由 SemaphoreFactory::createSemaphore 方法返回的同一个 Semaphore 实例。

提示

如果你没有显式释放信号量,它将在实例销毁时自动释放。在某些情况下,跨多个请求锁定资源可能很有用。要禁用自动释放行为,请将 createSemaphore() 方法的第五个参数设置为 false

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本