Skip to content

[Sempahore] Added first round of documentation #14144

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 7, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions components/semaphore.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
.. index::
single: Semaphore
single: Components; Semaphore

The Semaphore Component
=======================

The Semaphore Component manages `semaphores`_, a mechanism to provide
exclusive access to a shared resource.

.. versionadded:: 5.2

The Semaphore Component was introduced in Symfony 5.2.

Installation
------------

.. code-block:: terminal

$ composer require symfony/semaphore

.. include:: /components/require_autoload.rst.inc

Usage
-----

Semaphore are used to guarantee exclusive access to some shared resource.

Semaphore are created using a :class:`Symfony\\Component\\Semaphore\\SemaphoreFactory` class,
which in turn requires another class to manage the storage of Semaphore::

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);


The semaphore is created by calling the
:method:`Symfony\\Component\\Semaphore\\SemaphoreFactory::createSemaphore`
method. Its first argument is an arbitrary string that represents the locked
resource. Its second argument is the number of process allowed. Then, a call to
the :method:`Symfony\\Component\\Semaphore\\SemaphoreInterface::acquire` method
will try to acquire the semaphore::

// ...
$semaphore = $factory->createSemaphore('pdf-invoice-generation', 2);

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

$semaphore->release();
}

If the semaphore can not be acquired, the method returns ``false``. The
``acquire()`` method can be safely called repeatedly, even if the semaphore is
already acquired.

.. note::

Unlike other implementations, the Semaphore Component distinguishes
semaphores instances even when they are created for the same resource. If a
semaphore has to be used by several services, they should share the same
``Semaphore`` instance returned by the ``SemaphoreFactory::createSemaphore``
method.

.. tip::

If you don't release the semaphore explicitly, it will be released
automatically on instance destruction. In some cases, it can be useful to
lock a resource across several requests. To disable the automatic release
behavior, set the last argument of the ``createLock()`` method to
``false``.

.. _`semaphores`: https://en.wikipedia.org/wiki/Semaphore_(programming)