asyncio基本使用
'''
event_loop 事件循环:把一些任务(协程)注册到事件循环上
coroutine 协程:协程对象,一个使用async关键字定义的函数
future 对象: 和task上没有本质的区别
task 任务:对协程进行封装
async :python3.5 用于定义协程的关键字,也可以用装饰器@asyncio.coroutine
await : 用于挂起阻塞的异步调用接口
'''
import asyncio
'''
@asyncio.coroutine
def person(name):
return name
'''
async def person(name):
'''
若在协程中需要有延时操作,应该使用 await asyncio.sleep(),而不是使用time.sleep(),因为使用time.sleep()后会释放GIL,阻塞整个主线程,从而阻塞整个事件循环。
'''
await asyncio.sleep(1)
return name
# 定义协程对象
coroutine = person("张三")
# 定义事件循环对象容器
loop = asyncio.get_event_loop()
# 将协程转为task任务
task = loop.create_task(coroutine)
# task = asyncio.ensure_future(coroutine)
# 将task任务扔进事件循环对象中并触发
loop.run_until_complete(task)
#关闭事件循环
loop.close()
print(task.result())
回调
import asyncio
async def person(name):
'''
若在协程中需要有延时操作,应该使用 await asyncio.sleep(),而不是使用time.sleep(),因为使用time.sleep()后会释放GIL,阻塞整个主线程,从而阻塞整个事件循环。
'''
await asyncio.sleep(1)
return name
def my_callback(future):
print('返回值:', future.result())
# 定义协程对象
coroutine = person("张三")
# 定义事件循环对象容器
loop = asyncio.get_event_loop()
# 将协程转为task任务
task = loop.create_task(coroutine)
#回调
task.add_done_callback(my_callback)
# 将task任务扔进事件循环对象中并触发
loop.run_until_complete(task)
#关闭事件循环
loop.close()
多任务执行
import asyncio
async def coroutine_example(name):
print(name)
await asyncio.sleep(1)
print(name)
return name
loop = asyncio.get_event_loop()
tasks = [loop.create_task(coroutine_example(i)) for i in range(3)]
#非阻塞的任务控制
wait_coro = asyncio.wait(tasks)
loop.run_until_complete(wait_coro)
loop.close()
for task in tasks:
print(task.result())
动态添加协程
loop.call_soon_threadsafe() :与 call_soon()类似,等待此函数返回后马上调用回调函数,返回值是一个 asyncio.Handle 对象,此对象内只有一个方法为 cancel()方法,用来取消回调函数。
loop.call_soon() : 与call_soon_threadsafe()类似,call_soon_threadsafe() 是线程安全的
loop.call_later():延迟多少秒后执行回调函数
loop.call_at():在指定时间执行回调函数,这里的时间统一使用 loop.time() 来替代 time.sleep()
asyncio.run_coroutine_threadsafe(): 动态的加入协程,参数为一个回调函数和一个loop对象,返回值为future对象,通过future.result()获取回调函数返回值