menuTicketing

Библиотека Ticketing для Python

GitHub

Репозиторий

bash

Пример

Базовый пример

API на основе asyncio. Подключение к одному серверу, получение ключа и немедленный возврат.

python
broker = TicketBroker.connect("127.0.0.1:5225")
try:
    await broker.wait_ready(5)

    ticket = await broker.acquire("key", wait=5, lease=30)
    await ticket.release()

    print("pass")
finally:
    broker.close()

Пример конкурентности (распределённая блокировка)

Пример, проверяющий, что несколько задач asyncio, взаимно исключая друг друга через блокировку по счёту, при повторяющихся пополнениях/снятиях всегда возвращают баланс к начальному значению. При использовании async with ticket возврат происходит автоматически при выходе из блока.

python
async def transaction(broker: TicketBroker, account: int, delta: int) -> None:
    key = f"account-{account}"

    try:
        ticket = await broker.acquire(key, WAIT, LEASE)
    except Exception as e:
        log.error("account %s acquire failed: %s", account, e)
        return

    async with ticket:
        before = BALANCES[account]
        await asyncio.sleep(0)
        after = before + delta
        BALANCES[account] = after

        action, sign = ("withdraw", "-") if delta < 0 else ("deposit", "+")
        log.info("account %s %s %s$%s -> $%s", account, action, sign, AMOUNT, after)

Полный пример смотрите в test_example.py, test_bank.py, test_bench.py.