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();
}
如果无法获取信号量,该方法将返回 false
。acquire()
方法可以安全地重复调用,即使信号量已被获取。
注意
与其他实现不同,Semaphore 组件即使为同一资源创建信号量实例,也会区分它们。如果一个信号量必须被多个服务使用,它们应该共享由 SemaphoreFactory::createSemaphore
方法返回的同一个 Semaphore
实例。
提示
如果你没有显式释放信号量,它将在实例销毁时自动释放。在某些情况下,跨多个请求锁定资源可能很有用。要禁用自动释放行为,请将 createSemaphore()
方法的第五个参数设置为 false
。