背景
python对于多线程受限于GIL(全局解释器锁)导致其性能大大降低,并不能实现真正意义上的并发。用协程倒是一个节约内存提升效率的不错Idea。
一.了解几个概念
-
什么是异步任务?
所谓异步任务就是,在进行IO(Input/Output)操作时或者在进行耗时操作的时候,不必等待程序立马结束返回结果,你可以继续做其他的事情,当它结束的时候会得到通知。
举个栗子:
在平时的生活当中我们经常会进行短信注册,这个时候它就用的是异步任务。 -
什么是协程?
协程的英文是Coroutine,是一个微线程,协程的调度由用户程序来控制 -
线程,进程,协程的区别?
- 进程是CPU级别的,是操作系统分配资源的最小单元
- 线程是运行在进程中的,是CPU调度和分配的基本单元
二.asyncio的使用
- 安装asyncio
pip install asyncio
- 定义协程
async def do_some_work(x): pass
- asyncio的基本使用demo
# -*-coding:utf-8-*-
import asyncio
import functools
async def multi_fun(x):
print("waiting:{}".format(x))
await asyncio.sleep(x)
# loop.stop() # 手动结束loop
async def multi_funs(x):
print("waiting:{}".format(x))
await multi_fun(x)
def done_callback(trans):
print("Done", trans)
loop.stop()
async def timer(x, cb):
futu = asyncio.ensure_future(asyncio.sleep(x))
futu.add_done_callback(cb)
await futu
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# 1.run_util_complete()方法运行协程
loop.run_until_complete(multi_fun(3))
loop.run_until_complete(asyncio.ensure_future(multi_fun(x=3)))
# 2.协程执行完成后回调方法
en_fun = asyncio.ensure_future(multi_fun(3))
en_fun.add_done_callback(done_callback)
loop.run_until_complete(en_fun)
# 3.运行多个协程,coroutine gather,运行完成后回调结束
coroutine_list = [multi_fun(3), multi_funs(5)]
multi_coroutine = asyncio.gather(*coroutine_list)
multi_coroutine.add_done_callback(done_callback)
loop.run_until_complete(multi_coroutine)
# 4.run_forever()方法运行协程,方法内部手动结束协程
asyncio.ensure_future(multi_fun(5))
loop.run_forever()
# 5.run_forever()方法运行,回调结束
coroutine_list = [multi_fun(5), multi_funs(3)]
_gather = asyncio.gather(*coroutine_list)
_gather.add_done_callback(functools.partial(done_callback))
loop.run_forever()
# 6.gather 和wait的用法
coroutine_list = [multi_fun(5), multi_funs(3)]
loop.run_until_complete(asyncio.wait(coroutine_list))
t = timer(3, lambda futu: print('Done'))
loop.run_until_complete(t)
# 关闭loop,以彻底清除loop对象防止误用
loop.close()