Python协程详解:从原理到gevent自动切换

周叙
周叙
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python协程的概念及其与线程的区别。通过对比线程切换的高开销,介绍基于yield的协程原理,并详细演示如何使用greenlet库进行手动切换,以及利用gevent库在IO操作中实现自动切换,帮助开发者高效实现多任务处理。

什么是协程

什么是协程

协程是Python中实现多任务的一种机制,它比线程更轻量,占用的执行单元(资源)更少。之所以称其为执行单元,是因为协程自带CPU上下文,能够在合适的时机将一个协程切换到另一个协程。只要在此过程中正确保存和恢复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实现手动切换

协程 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实现IO自动切换

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 相关产品和应用

全部下载

专题列表