Asyncio
1. Base Event Loop
-
BaseEventLoop类
不应该被直接调用或被放在第三方包中调用(使用AEL代替),BEL属于AbstractEventLoop
-
AbstractEventLoop类
抽象的基类,非线程安全
1.1 Run an event loop
1.1.1 AbstractEventLoop.run_forever()
会一直运行直到stop()方法触发
1.1.2 AbstractEventLoop.run_until_complete(future)
会一直运行直到Future运行结束,如果是一个协程对象,就会被ensure_future()来装饰.
会返回Future的结果,或者报错
1.1.3 AbstractEventLoop.is_running()
返回event_loop的运行状态
1.1.4 AbstractEventLoop.stop()[3.5.1新增]
会终止run_forever()
在一个合适的时机:
If stop() is called while run_forever() is running, this will run the current batch of callbacks and then exit. Note that callbacks scheduled by callbacks will not run in that case; they will run the next time run_forever() is called.Changed in version 3.5.1.
1.1.5 AbstractEventLoop.is_closed()
3.4.2新增方法 如果event loop被关闭了 返回True
1.1.6 AbstractEventLoop.close()
彻底关闭, 这个方法会清除掉executor,并且不会像stop一样在恰当时机关闭 而是直接关闭
不可逆
1.1.7 AbstractEventLoop.shutdown_asyncgens()[coroutine ]
3.6新增方法
try:
loop.run_forever()
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
1.2 Calls | 调用
大部分异步函数不接受多个参数,所以调用的时候 用functools.partial偏函数来装饰
- 注意: partial函数要比lambda表达式要好,因为asyncio包可以识别partial里面的对象并在debug的时候展示,而lambda则不行
1.2.1 AbstractEventLoop.call_soon(callback, *args)
这是一个先进先出的(按注册顺序)队列
返回asyncio.Handle() 用于控制callback
1.2.2 AbstractEventLoop.call_soon(callback, *args)
和1.2.1一样 只不过是线程安全的
1.3 Delayed calls | 延时调用
event loop有他内在的时钟来计算超时[不过 这个延时不能超过一天]
1.3.1 AbstractEventLoop.call_later(delay, callback, *args)
返回asyncio.Handle() 用于控制callback
1.3.2 AbstractEventLoop.call_at(when, callback, *args)
返回asyncio.Handle() 用于控制callback
1.3.3 AbstractEventLoop.time()
返回当前时间,是一个float值(这个是由eventloop的内部时钟给出的)
- asyncio.sleep()方法也用到了这个eventloop的时钟
1.4 Futures
1.4.1 AbstractEventLoop.create_future()
创建asyncio.Future对象 这个是在asyncio里面创建Future的推荐方法 3.5.2新增方法
1.5. Tasks
1.5.1 AbstractEventLoop.create_task(coro)
设定协程对象的执行,用future包裹他,返回一个Task对象
第三方包的event_loop可能有他们自己定义的task,但是必须是Task类的子集
3.4.2新增的
1.5.2 AbstractEventLoop.set_task_factory(factory)
如果factory是None, 就会使用默认的
如果factory是可调用的,需要有一个(loop,coro)的签名[loop是当前运行的event_loop,coro是一个协程对象 这个可以调用的对象一定要返回一个asyncio.Future对象
3.4.4新增
1.5.3 AbstractEventLoop.get_task_factory()
返回当前的task_factory,如果是默认的task_factory类型,就会返回None
3.4.4新增