asyncio之同步原语
尽管asyncio应用经常是单线程进程运行,但是也同样可以构建同步应用。基于延迟、IO中断和其他事件的每一个coroutine或task可能在不可预测的顺序执行。为了支持安全同步,asyncio提供了和threading和multiprocessing模块相同的低水平原始接口。
锁
锁可以保证安全访问共享资源。只有加锁的才能使用资源。多个试图获取锁的将会阻塞住以便同一时间只有一个获取锁。
|
|
在这个例子中,lock可以直接调用,在coro2()方法中使用await获取锁,使用release()方法来释放锁。在coro1中可以使用with await关键字作为同步上下文管理。
|
|
事件
asyncio.Event基于threading.Event, 经常被用来允许多个消费者等待相关联的通知发生,而不需要特定的值。
|
|
就像锁一样,coro1()和coro2()都等待事件的发生。不同的是只要事件状态变化就都开始执行。
|
|
条件变量
Condition工作方式和Event相似,但是不是通知所有的等待的协程,而是根据传给notify()的参数只是唤醒一部分等待者。
|
|
这个例子中启动了5个Condition的消费者。每一个都使用wait()方法等待通知以便继续进行。manipulate_condition()方法中通知一个消费者,然后两个,最后是所有剩下的消费者。
|
|
队列
asyncio.Queue提供了先进先出的协程数据结构,就像线程中的queue.Queue和进程中的multiprocessing.Queue。
|
|
使用put()添加对象或者使用get()移除对象都是异步操作,直到队列数量固定(阻塞除外)或者队列为空(阻塞调用获取对象)
|
|