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

比如asyncio就定義了一個(gè)鎖對(duì)象Lock,它一次只允許一個(gè)協(xié)程來(lái)訪問(wèn)共享的資源,如果多協(xié)程想訪問(wèn)就會(huì)阻塞起來(lái),也就是說(shuō)如果一個(gè)協(xié)程沒(méi)有釋放這個(gè)鎖,別的協(xié)程是沒(méi)有辦法訪問(wèn)共享的資源。
例子:
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的實(shí)例-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://www.chinadenli.net/article28/idijp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、ChatGPT、品牌網(wǎng)站制作、標(biāo)簽優(yōu)化、手機(jī)網(wǎng)站建設(shè)、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容