十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
盡管asyncio庫是使用單線程來實(shí)現(xiàn)協(xié)程的,但是它還是并發(fā)的,亂序執(zhí)行的??梢哉f是單線程的調(diào)度系統(tǒng),并且由于執(zhí)行時(shí)有延時(shí)或者I/O中斷等因素,每個(gè)協(xié)程如果同步時(shí),還是得使用一些同步對(duì)象來實(shí)現(xiàn)。
比如asyncio就定義了一個(gè)鎖對(duì)象Lock,它一次只允許一個(gè)協(xié)程來訪問共享的資源,如果多協(xié)程想訪問就會(huì)阻塞起來,也就是說如果一個(gè)協(xié)程沒有釋放這個(gè)鎖,別的協(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()