python协程怎么做数据同步_Python 模块 asyncio-协程之间的同步

1532397954525b8765285c2

虽然 asyncio 是运行在单线程模型上的,但是它的每个协程可能执行的顺序是不一致的,这要看超时、IO、网络或者其他的资源使用情况。所以 asyncio 为了支持安全的并发,从模块 threading 和 multiprocessing 引入了一些处理并发的单元。

锁 Locks

锁被用来保护访问的资源,只有获取锁后才可以访问资源,同一时间只有一个协程可以获取锁。

15323979720657e72cfcbdf

执行:

15323979719940e5bece1c5

本例创建了两个协程,他们分别以两种方式获取和释放锁,一种使用 async with lock 语法,它会自动释放锁,另一种直接调用获取锁的方法 await lock.acquire(),然后使用 try:finally 释放锁。

因为 main() 协程一开始就获取锁了,需要等到 unlock() 方法执行释放锁后,两个协程才能获取锁。

事件 Events

asyncio.Event 基于 threading.Event,只有事件对象内部标志位设置了,其他的才会继续往下执行。

1532397972060f1e66d0d15

执行:

1532397972050be2a8ca04a

本例中,一开始的两个协程 c1() 和 c2() 等待事件对象被设置,当事件对象状态改变时,立刻执行。

条件 Conditions

条件(Condition)同步机制和 Events 类似,当调用 notify() 时,等待的协程就开始执行。

153239800400783d768b3e0

执行:

1532398004010d21748fd75

本例创建了5个消费者协程等待 Condition,wait() 直到所有的消费者协程执行完后才继续往下运行。manipulate_condition() 首先是释放了两个协程,然后使用 notify_all() 释放全部。

队列 Queues

asyncio.Queue 是一个 FIFO(first-in first-out)的数据结构,和 queue.Queue、multiprocessing.Queue 一样。

15323980330449a72f87a4e

执行:

1532398004000de71ab9280

调用队列的 get() 和 put() 方法时,都需要 await,因为他们都是异步操作,从队列获取元素有可能队列为空,添加元素可能队列元素数量已经达到最大值。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值