event loop就是一个普通的Python对象,可以通过asyncio.new_event_loop()创建无数个event loop对象。不过,loop.run_xxx()家族的函数都是阻塞的,比如run_until_complete()会等到给定的coroutine完成再结束,而run_forever()则会永远阻塞当前线程, 知道有人停止了该event loop为止。所以在同一个线程里, 两个event loop无法同时run, 但这不能阻止我们用两个线程分别跑两个event loop.
初始情况下,get_event_loop() 只会在主线程帮助我们创建新的event_loop, 并且在主线程中多次调用始终返回该event loop;而在其他线程中调用get_event_loop()则会报错,除非我们在这些线程中手动调用过set_event_loop()。
补充:
new_event_loop() 是创建一个event loop对象,而set_event_loop(eventloop对象)是将event loop对象指定为当前线程的event loop, 一个线程中只允许运行一个event loop, 意味着不能有两个eventloop交替运行。这两个一般搭配使用,用于给非主线程创建eventloop. 如果是主线程,则只需要get_event_loop()就可以了,也就是说,我们想运用协程,首先要生成一个loop对象,然后loop.run_xxx()就可以运行协程了,而如何创建这个loop,对于主线程是loop = get_event_loop(), 对于其他线程需要首先loop = new_event_loop(), 然后set_event_loop(loop)
asyncio.gather 将一些 Future 和 coroutine 封装成一个 Future。
asyncio.wait方法则返回一个 coroutine。
run_until_complete 既可以接收 Future 对象,也可以是 coroutine 对象,如果是coroutine,则先把他转化为future
ensure_future 可以将 coroutine 封装成 Task。
asyncio.ensure_future(coro_or_future, *, loop=None)
task是可以理解为单个coroutine,经过ensure_future方法处理而形成,而众多task所组成的集合经过asyncio.gather处理而形成一个future。
再不精确的粗略的说,future就是存放着众多task或future的容器。
而task又是future的子类,所以不管是task还是future还是coreture都可以看成是一个广义的携程,future无非是一个内部包含众多携程的大携程而已,await后面,task,coroture,future都可以接。
example 1:
example 2: