之前研究过 tornado 的 py2.7 版本, 对 asyncio 的协程不是太熟。 据我所知,tornado 的协程调度都是依赖于 epoll_wait 的,只有 IO 事件发生才会发生协程调度,也就是说没法主动调度。 但是 asyncio 好像不是, 参见协程同步原语。比如说
loop = asyncio.get_event_loop()
loop.set_debug(True)
lock = asyncio.Lock()
async def task():
await lock
print("get lock now, then sleep 2s")
await asyncio.sleep(2)
print("wakeup")
lock.release()
print("sleep 1s")
await asyncio.sleep(1)
loop.run_until_complete(
asyncio.gather(task(), task())
)
input()
在 asyncio 中,用 Lock 来同步的话, 协程调度机制是如何知道 Lock 已经 release 了, 然后调度正在 wait 这个锁的协程去执行的?毕竟 Lock 的 release 操作没有 IO 事件发生啊