可乐博客

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释放控制权,那其实不用加锁,因为协程是手动控制释放执行权的,不手动释放的话,其他协程是插不进来的

Pythonic