Skip to main content

asyncio shared/exclusive mode lock

Project description

asyncio-multilock

License GitHub Actions Workflow Status

asyncio_multilock provides MultiLock, an asyncio based lock with built-in shared/exclusive mode semantics.

MultiLock.locked can be in one of three states:

  1. MultiLockType.NONE - not acquired;
  2. MultiLockType.SHARED - acquired one or more times in shared mode;
  3. MultiLockType.EXCLUSIVE - acquired one time in exclusive mode.

When a lock is acquired, a Hashable handle is returned which uniquely identifies the acquisition. This handle is used to release the acquisition.

from asyncio import create_task, sleep
from asyncio_multilock import MultiLock, MultiLockType

lock = MultiLock()
assert not lock.locked

shared1 = await lock.acquire(MultiLockType.SHARED)
assert lock.locked is MultiLockType.SHARED

shared2 = await lock.acquire(MultiLockType.SHARED)

async def wait_release_shared(delay: float) -> None:
    await sleep(delay)
    lock.release(shared1)
    lock.release(shared2)
create_task(wait_release_shared(3))

# Acquisition context manager.
async with lock.context(MultiLockType.EXCLUSIVE) as exclusive:
    # Blocked for 3 seconds.
    assert lock.locked is MultiLockType.EXCLUSIVE

The lock can also be acquired synchronously, returning no handle if the acquisition fails.

from asyncio_multilock import MultiLock, MultiLockType

lock = MultiLock()
assert not lock.locked

shared = lock.acquire_nowait(MultiLockType.SHARED)
assert shared

exclusive = lock.acquire_nowait(MultiLockType.EXCLUSIVE)
assert not exclusive

assert lock.locked is MultiLockType.SHARED

The lock can also be monitored for when a given lock type is next acquirable.

from asyncio_multilock import MultiLock, MultiLockType

lock = MultiLock()

async with lock.notify(MultiLockType.SHARED) as event:
    await event.wait()
    print("shared lock is acquirable")
    event.clear()

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asyncio_multilock-0.2.0.tar.gz (20.3 kB view hashes)

Uploaded Source

Built Distribution

asyncio_multilock-0.2.0-py3-none-any.whl (3.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page