python 协程为什么不用加锁_python里协程使用同步锁Lock

尽管asyncio库是使用单线程来实现协程的,但是它还是并发的,乱序执行的。可以说是单线程的调度系统,并且由于执行时有延时或者I/O中断等因素,每个协程如果同步时,还是得使用一些同步对象来实现。

比如asyncio就定义了一个锁对象Lock,它一次只允许一个协程来访问共享的资源,如果多协程想访问就会阻塞起来,也就是说如果一个协程没有释放这个锁,别的协程是没有办法访问共享的资源。

例子:

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()输出结果如下:

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游戏开发入门

你也能动手修改C编译器

纸牌游戏开发

五子棋游戏开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值