在python里協(xié)程使用同步鎖Lock的實(shí)例
盡管asyncio庫(kù)是使用單線程來(lái)實(shí)現(xiàn)協(xié)程的,但是它還是并發(fā)的,亂序執(zhí)行的??梢哉f(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()
輸出結(jié)果如下:
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 acquired lock coro2 released lock
以上這篇在python里協(xié)程使用同步鎖Lock的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
wxpython實(shí)現(xiàn)按鈕切換界面的方法
這篇文章主要為大家詳細(xì)介紹了wxpython實(shí)現(xiàn)按鈕切換界面的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Python Dict找出value大于某值或key大于某值的所有項(xiàng)方式
這篇文章主要介紹了Python Dict找出value大于某值或key大于某值的所有項(xiàng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
教你用 Python 發(fā)送告警通知到微信的操作過(guò)程
大家都知道常見(jiàn)的告警方式有:郵件,電話,短信,微信,今天通過(guò)本文給大家介紹下Python 發(fā)送告警通知到微信的操作過(guò)程,感興趣的朋友一起看看吧2022-01-01
Python?Generator生成器函數(shù)基本概念及高級(jí)用途技巧示例
這篇文章主要為大家介紹了Python?Generator生成器函數(shù)基本概念及高級(jí)用途技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
基于asyncio 異步協(xié)程框架實(shí)現(xiàn)收集B站直播彈幕
本文給大家分享的是基于asyncio 異步協(xié)程框架實(shí)現(xiàn)收集B站直播彈幕收集系統(tǒng)的簡(jiǎn)單設(shè)計(jì),并附上源碼,有需要的小伙伴可以參考下2016-09-09
Pytorch distributed 多卡并行載入模型操作
這篇文章主要介紹了Pytorch distributed 多卡并行載入模型操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

