Python 学习之 ---asyncio 库的使用

asyncio 库的使用

3.4版本加入标准库
asyncio 底层基于selector 实现,看似库,其实就是个框架,包含同步IO, 事件循环,协程,任务等内容

举例:

def a():
    for i in range(3):
        print('a.x',i)
def b():
    for i in range(3):
        print('b.x' ,i)
a()
b()
# 现在要交替打印结果?除了使用多进程多线程之外还可以使用什么方法?
# 生成器对象
#对上面代码进行改进
def a():
    for i in range(3):
        print('a.x',i)
        yield
def b():
    for i in range(3):
        print('b.x' ,i)
        yield
x = a()
y = b()
for x in range(3):
    next(x)
    next(y)
# 上面一个生成器对象就可以实现函数值的交替打印

下面接触一个新的库:asyncio

事件循环

事件循环是asyncio 提供的核心运行机制

协程

  • 协程不是进程,也不是线程,它是用户空间调度的完成并发的处理的方式
  • 进程,线程由操作系统完成调度,而协程是线程内完成调度,它不需要更多的线程,自然也没有多线程切换带来的开销
  • 协程是非抢占式调度,只有一个协程主动让出控制权,另一个协程才会被调度
  • 协程也不需要使用锁机制,因为是在同一个线程中执行
  • 多CPU下,可以使用多进程和协程配合,既能进程并发又能发挥协程在单线程中的优势
  • Python 中协程是基于生成器的
  • asyncio.iscoroutine(obj) 判断是不是协程对象
  • asyncio.iscoroutinefunction(func) 判断是不是协程函数

协程的使用:

3.4 引用了asyncio ,使用装饰器,将生成器函数转换成协程函数,就可以在事件循环中执行了

import asyncio
# 下面的装饰器为3.4 版本下使用的装饰器格式
@asyncio.coroutine
def func1():
    for i in range(3):
        yield from asyncio.sleep(1)# 睡眠1秒  
        print('~~~~~~~~~~')
    return 'my  return value = {}'.format(1000)  # 函数返回值
print(asyncio.iscoroutinefunction(func1))   # 判断是否是协程函数
print(asyncio.iscoroutine(func1()))  # 判断是否是协程对象
# 开启一个大循环
loop = asyncio.get_event_loop()  
# 创建future对象
#方法一:正常使用这种方法创建
future = asyncio.ensure_future(func1())  # 将协程对象包装成带未来值的对象
loop.run_until_complete(future)
# 确保得到一个future 对象 ,对协程对象进行封装
# 如果不是future对象,对调 creat_task 进行创建一个

#方法二:
task = loop.create_task(func1())  # 通过loop下的creat_task(func1()) 
loop.run_until_complete(task)
# 方法三:
loop.run_until_complete(func1())  
#因为这 一定会执行一下 ensure_future(func1()),
# 上面三种方法得到的结果是一样的,都能实现事件循环
print(2,future)
print(future.result)
print(3,task

你可能感兴趣的:(Python学习历程,Python,学习)