async在什么时候使用锁
原文地址
没有使用锁时
class A:
def __init__(self):
self.a = 1
async def run(self):
self.a += 1
await asyncio.sleep(1)
self.a -= 1
print(self.a)
a = A()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(a.run(), a.run(), a.run(), a.run()))
#>>> 4
#>>> 3
#>>> 2
#>>> 1
使用锁时
import asyncio
class A:
def __init__(self):
self.a = 1
self.lock = asyncio.Lock()
async def run(self):
async with self.lock:
self.a += 1
await asyncio.sleep(1)
self.a -= 1
print(self.a)
a = A()
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(a.run(), a.run(), a.run(), a.run()))
#>>> 1
#>>> 1
#>>> 1
#>>> 1
引用同事的话,在使用一个公用变量的时候,中途要await把当前线程的执行权放出去,但又不希望其他协程来访问或者修改这个公共变量的时候,就要用锁了,如果中途没有await释放控制权,那其实不用加锁,因为协程是手动控制释放执行权的,不手动释放的话,其他协程是插不进来的