同步原语
尽管asyncio程序通常是单线程运行的,它们仍然可以构建并发程序。基于来自I/O和其他外部事件的延迟和中断,每个协程或Task可能以不可预知的顺序执行。为了支持并发安全,asyncio实现了一些低级的原子操作,类似于threading和multiprocessing模块中的。
Locks
Lock可以用来保护对共享资源的访问,只有锁的持有者可以使用该资源。多次尝试获取锁的操作将被阻止,因此一次只有一个持有者。
锁可以直接被调用,使用await获取锁,当任务完成时调用release()方法释放锁。它们也可以使用with await关键字作为异步上下文管理器。
Events
asyncio.Event是基于threading.Event的,用于允许多个消费者等待发生的事情,而不寻找与通知相关联的特定值。
和Lock一样,coro1()和coro2()都在等待Event被设置,不同之处在于两者都可以在事件状态改变时立即开始,并且他们不需要获取对event对象的唯一保持。
Conditions
Condition的工作方式跟Event的很类似,除了不是通知所有等待的协程,唤醒的等待者的数量是通过notify()参数来控制的。
这个例子中我们启动了五个监视Condition的消费者,每一个都使用 wait()方法等待让他们继续运行的通知。manipulate_condition()通知了一个消费者然后两个消费者,最后所有的消费者。
Queues
asyncio.Queue提供了协程的先入先出的数据结构,类似于多线程的queue.Queue和多进程的multiprocessing.Queue。
通过put()函数添加元素,get()函数获取元素都是异步操作,因为队列大小可能是固定的(阻塞添加),或者队列可能是空的(阻塞调用来获取项目)。
本文翻译自《The Python3 Standard Library By Example》asyncio相关章节