python异步I/O

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()获取回调函数返回值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值