盡管asyncio庫是使用單線程來實現(xiàn)協(xié)程的,但是它還是并發(fā)的,亂序執(zhí)行的。可以說是單線程的調(diào)度系統(tǒng),并且由于執(zhí)行時有延時或者I/O中斷等因素,每個協(xié)程如果同步時,還是得使用一些同步對象來實現(xiàn)。
比如asyncio就定義了一個鎖對象Lock,它一次只允許一個協(xié)程來訪問共享的資源,如果多協(xié)程想訪問就會阻塞起來,也就是說如果一個協(xié)程沒有釋放這個鎖,別的協(xié)程是沒有辦法訪問共享的資源。
例子:
import asyncioimport 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 coroutineslock acquired: Truewaiting for coroutinescoro1 waiting for the lockcoro2 waiting for the lockcallback releasing lockcoro1 acquired lockcoro1 released lockcoro2 acquired lockcoro2 released lock
以上這篇在python里協(xié)程使用同步鎖Lock的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林站長站。
新聞熱點
疑難解答