并行是同时执行,并发是极快速的交替执行。
Asyncio 是并发的一种方式。对 Python 来说,并发还可以通过线程(threading)和多进程(multiprocessing)来实现。
Asyncio 并不能带来真正的并行(parallelism)。当然,因为 GIL(全局解释器锁)的存在,Python 的多线程也不能带来真正的并行。
可交给 asyncio 执行的任务,称为协程(coroutine)。一个协程可以放弃执行,把机会让给其它协程(即 yield from 或 await)。yield是比较老的,他们的联系这就不多BB,也没啥用,直街开始await也没有关系。
1.定义协程,函数前加上async。
async def sleep_second(x):
await asyncio.sleep(x)
return '3 secoonds'
这个协程就是睡眠几秒,耗时操作前用await,表示等待一个另一个协程结束。
2.运行协程
第一种:在另一个运行的协程中用await等待它;第二种:通过ensure_future函数计划执行。
协程需要loop运行,协程才能运行。
loop = asyncio.get_event_loop()
loop.run_until_complete(sleep_second(3))
run_until_complete是一个阻塞调用,知道协程运行结束它才返回。它会把传给它的协程对象检查,然后通过ensure_future函数把协程包装成future。
3.增加回调函数
def done_callback(fun):
print('sleep over,{}'.format(fun.result))
这里注意,定义回调函数要个形参数,接受的回调他的future,future.result可以取有return结果的future。
futu = asyncio.ensure_future(sleep_time(3))
futu.add_done_callback(done_callback)
loop = asyncio.get_event_loop()
loop.run_until_complete(futu)
4.多个协程
使用asyncio.gather函数
loop.run_until_complete(asyncio.gather(time_sleep(3),time_sleep(3)))
或者放在列表传进去
coros = [time_sleep(1), time_sleep(3)]
loop.run_until_complete(asyncio.gather(*coros))