盡管asyncio庫是使用單線程來實現(xiàn)協(xié)程的,但是它還是并發(fā)的,亂序執(zhí)行的。可以說是單線程的調度系統(tǒng),并且由于執(zhí)行時有延時或者I/O中斷等因素,每個協(xié)程如果同步時,還是得使用一些同步對象來實現(xiàn)。

比如asyncio就定義了一個鎖對象Lock,它一次只允許一個協(xié)程來訪問共享的資源,如果多協(xié)程想訪問就會阻塞起來,也就是說如果一個協(xié)程沒有釋放這個鎖,別的協(xié)程是沒有辦法訪問共享的資源。
例子:
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 def main(loop):
# Create 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('waiting for coroutines')
await asyncio.wait([coro1(lock), coro2(lock)]),
event_loop = asyncio.get_event_loop()
try:
event_loop.run_until_complete(main(event_loop))
finally:
event_loop.close()
名稱欄目:在python里協(xié)程使用同步鎖Lock的實例-創(chuàng)新互聯(lián)
網址分享:http://www.yijiale78.com/article28/idijp.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、ChatGPT、品牌網站制作、標簽優(yōu)化、手機網站建設、電子商務
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)