Metadata-Version: 2.1
Name: dimutex
Version: 1.3.1
Summary: Mutex implementation for distributed systems.
Keywords: mutex,google,google cloud,gcs,gcp,microservices
Author-email: Gram <gram@orsinium.dev>
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development
Requires-Dist: aiohttp
Requires-Dist: gcloud-aio-auth
Requires-Dist: bandit ; extra == "lint"
Requires-Dist: flake8 ; extra == "lint"
Requires-Dist: isort ; extra == "lint"
Requires-Dist: mypy ; extra == "lint"
Requires-Dist: unify ; extra == "lint"
Requires-Dist: pytest>=6.2.0 ; extra == "test"
Requires-Dist: pytest-asyncio ; extra == "test"
Requires-Dist: pytest-cov ; extra == "test"
Project-URL: Source, https://github.com/orsinium-labs/dimutex
Provides-Extra: lint
Provides-Extra: test

# dimutex

Python library implementing [asyncio][asyncio]-based distributed mutex on top of different providers.

[Mutex][mutex] is a synchronization primitive used to ensure that only one worker can do the given job. It can be used for safe access to a shared resource or for distributing tasks among multiple workers.

Currently, the only implemented provider is GCS (Google Cloud Storage). The implementation is based on the algorithm described in article [A robust distributed locking algorithm based on Google Cloud Storage][gcs-algo] (see also [Ruby implementation][ruby]).

[asyncio]: https://docs.python.org/3/library/asyncio.html
[mutex]: https://stackoverflow.com/questions/34524/what-is-a-mutex
[gcs-algo]: https://www.joyfulbikeshedding.com/blog/2021-05-19-robust-distributed-locking-algorithm-based-on-google-cloud-storage.html
[ruby]: https://github.com/FooBarWidget/distributed-lock-google-cloud-storage-ruby

## Features

+ Asynchronous.
+ Type-safe.
+ Atomic.
+ Expiration mechanism to ensure that a single worker won't hold the lock forever.
+ Supports emulators.

## Installation

```bash
python3 -m pip install dimutex
```

## Usage

```python
import dimutex

async def do_something():
    lock = dimutex.GCS(bucket='bucket-name', name='lock-name')
    async with lock:
        try:
            await lock.acquire()
        except dimutex.AlreadyAcquiredError:
            return 'already acquired'
        try:
            ... # do something with the shared resuource
        finally:
            await lock.release()
```

