Python——协程操作
2018-08-23 本文已影响17人
阿猫阿狗py
1. 协程,常被称为微线程,是一种多任务并发的操作方式
Python中的多任务处理,根据资源消耗情况可以选择多进程并发同时也可以在节省系统资源的情况下选择协程并发,协程由于是工作在一个线程中的执行单元,所以系统资源消耗是最少的
定义:协程是运行在单线程中的并发程序
多任务并发
安装gevent模块 #该模块提供了基于事件的单线程多任务事件管理机制
pip install gevent
from greenlet import greenlet
def sing():
while 1:
print("sing...")
g2.switch()
def dance():
while 1:
print("dance…")
g1.switch()
if __name__ == "__main__":
# 单线程多任务操作
# 创建两个协程序
g1 = greenlet(sing)
g2 = greenlet(dance)
# 首选切换让g1执行
g1.switch()
基于事件的协程让步执行
import gevent
def sing():
while 1:
print("sing...")
# 切换标志:让步:可以执行一个异步任务
gevent.sleep(1)
def dance():
while 1:
print("dance…")
# 切换标志:让步
gevent.sleep(1)
if __name__ == "__main__":
# 创建协程序
g1 = gevent.spawn(sing)
g2 = gevent.spawn(dance)
g1.join()
g2.join()
基于python生成器对象的多任务
Python中为了有效地利用内存进行程序的运算操作,提供了一个生成器对象yield,所谓生成器,就是在程序执行到该代码时才参与运算得到结果,经常被用作协程操作和组合数据类型的推倒生成。
通过生成器操作完成协程的处理
生成器:当代码执行到这一行时,预加载准备但是不会直接执行,当该预加载代码需要运算时才会主动执行
生成器对象主要的核心函数就是next(),通过next()方法才能执行运算得到运算的下一个结果值。
def sing():
while 1:
print("唱歌>>>>>>>>>>>>>>>>>>>>>>>>>>")
yield()# 协程让步->让同一个线程中的其他协程可以执行。
def dance():
while 1:
print("跳舞<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
next(s)# 主动调用->通过next()函数,直接调用sing()协程开始运行
if __name__ == "__main__":
s = sing()
d = dance()
协程:python3.4版本
Python版本中添加了异步io操作模块asyncio,对于协程的操作支持就变得比较友好,通过异步io操作,可以将多路io程序通过协程的方式提升操作效率
import asyncio
# 协程:coroutine
# 声明一个协程函数
@asyncio.coroutine
def sing():
while 1:
print("唱吧唱吧.......")
# 协程让步:执行异步操作,让另一个函数也同时执行
yield from asyncio.sleep(2)
@asyncio.coroutine
def dance():
while 1:
print("跳舞跳舞.......")
yield from asyncio.sleep(1)
if __name__ == "__main__":
# 创建一个事件轮询对象
loop = asyncio.get_event_loop()
# 编译多个函数[事件]到轮询对象中
loop.run_until_complete(asyncio.gather(sing(), dance()))
# 关闭事件轮询对象
loop.close()
协程:python3.5版本
Python3.5中新增了新的操作机制以提高对协程的支持
新增async代替了原来的@asyncio.corotine,新增await替代了原有的yield from步骤,简化和优化了原有协程处理流程。
import asyncio
async def sing():
# 声明异步函数
while 1:
print("sing.........")
await asyncio.sleep(1) # 模拟这里产生了一个异步操作[异步IO]
async def dance():
# 声明异步函数
while 1:
print("dance.........")
await asyncio.sleep(2)
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(sing(), dance()))
loop.close()