简单了解python协程的相关知识

什么是协程

协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的

通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的

协程和线程的差异

在实现多任务时,线程会自己欢子一些数据,操作系统切换时需要恢复数据,所以线程恢复比较耗性能

协程底层原理(举例)

'''

1,协程的实现原理,底层通过 yield 实现

'''

def work1(): #工作任务

for i in range(10):

print('work1----{}'.format(i))

yield i

def work2():

for i in range(10):

print('work2----{}'.format(i))

yield i

def work3():

for i in range(10):

print('work3----{}'.format(i))

yield i

g1 = work1()

g2 = work2()

g3 = work3()

while True: #循环调用生成器实现任务切换

try:

print(next(g1))

print(next(g2))

print(next(g3))

except StopIteration :

pass

break

协程 greenlet

python -m pip install greenlet

示例

'''

1,展示greenelent ,不能自动切换需要手动切换

'''

import greenlet

def work1():

for i in range(10):

print('work1----{}'.format(i))

g2.switch() #切换到g2

def work2():

for i in range(10):

print('work2----{}'.format(i))

g1.switch() #切换到g1

g1 = greenlet.greenlet(work1) #返回协程对象

g2 = greenlet.greenlet(work2)

g1.switch() #启动开关

执行顺序

gevent

greenlet 已经实现了协程,但是还是人工切换,gevent 提供了自动切换功能,其原理是执行过程中遇到IO操作,自动切换

'''

协程gevent IO操作会切换

'''

import gevent

def work1(): # 工作任务

for i in range(10):

print('work1----{}'.format(i))

gevent.sleep(0.5)

def work2():

for i in range(10):

print('work2----{}'.format(i))

gevent.sleep(0.5)

g1 = gevent.spawn(work1) #指定工作函数

g2 = gevent.spawn(work2) #指定工作函数

g1.join() #等待协程执行完成再往下走

g2.join()

以上是 简单了解python协程的相关知识 的全部内容, 来源链接: utcz.com/z/336218.html

回到顶部