在python裡協程使用同步鎖Lock的例項

2022-09-28 08:39:08 字數 1804 閱讀 7582

儘管asyncio庫是使用單執行緒來實現協程的,但是它還是併發的,亂序執行的。可以說是單執行緒的排程系統,並且由於執行時有延時或者i/o中斷等因素,每個協程如果同步時,還是得使用一些同步物件來實現。

比如asyncio就定義了乙個鎖物件lock,它一次只允許乙個協程來訪問共享的資源,如果多協程想訪問就會阻塞起來,也就是說如果乙個協程沒有釋放這個鎖,別的協程是沒有辦法訪問共享的資源。

例子:import asyncio

import functools

def unlock(lock):

print('callback releasing lock')

lock.release()

async def coro1(lock):

print('coro1 waiting for the lock')

with await lock:

print('coro1 acquired lock')

print('coro1 released lock')

async def coro2(lock):

print('coro2 waiting for the lock')

await lock

try:

print('coro2 acquired lock')

finally:

print('coro2 released lock')

lock.release()

async dwww.cppcns.comef main(loop):

# hxxvfnzdcreate and acquire a shared lock.

lock = asyncio.lock()

print('acquiring the lock before starting coroutines')

await lock.acquire()

print('lock acquired: {}'.format(lock.locked()))

# schedule a callback to unlock the lock.

loop.call_later(0.1, functools.partial(unlock, lock))

# run the coroutines that want to use the lock.

print('wai for coroutines')

await hxxvfnzdasyncio.wait([coro1(lock), coro2(lock)]),

event_loop = asyncio.get_event_loop()

try:

event_loop.run_until_complete(main(event_loop))

finally:

event_loop.close()

輸出結果如下:

acquiring the lock before starting coroutines

lock acquired: true

waiting for coroutines

coro1 waiting for the lock

coro2 waiting for the lock

callback releasing lock

coro1 acquired lock

coro1 released lock

coro2 acqui程式設計客棧red lock

coro2 released lock

本文標題: 在python裡協程使用同步鎖lock的例項

本文位址:

python協程與同步

協程簡介 協程又稱之為微執行緒,協程看上去也是子程式,但在執行的過程中,在子程式內部可中斷,然後轉而執行別的子程式,在適當的時候返回來接著執行程式。當然子程式是協程的特列。個人見解 協程相當與在子程式 假設稱之為a程式 執行的過程中執行到一定的步驟後可以進行中斷 注 這裡的中斷當然不能夠是函式呼叫 ...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

優雅的使用 Python 協程

協程 coroutine 是由程式設計師在 中顯示排程的。程序和執行緒是由作業系統排程,執行緒是作業系統排程的最小單位 看過前邊的文章應該知道,執行緒任務在 io 阻塞之後,作業系統會進行執行緒切換,這個切換會浪費時間與資源。而協程是在單個執行緒中併發的多個任務,當執行中的協程任務遇到阻塞之後,立即...