menuTicketing

مكتبة Ticketing لـ Python

GitHub

المستودع

bash

أمثلة

مثال بسيط

واجهة برمجية قائمة على 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.