协程

本文深入探讨Python的协程概念,解释其如何实现轻量级并发,并通过实例展示在处理I/O密集型任务时的高效性。同时,文章还会对比多进程和协程的区别,帮助读者理解在不同场景下选择合适的技术。
摘要由CSDN通过智能技术生成
# 进程——启动多个进程,进程之间是由操作系统负责调用
# 线程——启动多个线程,真正由CPU执行的最小单位是线程
    # 开启一个线程有属于自己的一小块内存
    # 关闭一个线程
# 协程——本质上是一个线程
    # 能够在多个任务之间切换来节约IO时间,协程中任务切换时间开销远远低于线程进程的切换时间
# 这三者都是实现并发的手段

def consumer(): # 生成器函数
    while True:
        x = yield
        print("处理了数据:",x)

# c = consumer() 调用生成器函数,拿到一个生成器,函数不执行
# next(c) 此刻才开始从生成器函数的第10行开始执行
# c.send(1) 从一个yield开始,到下一个yield停止
        
def producer():
    c = consumer()
    next(c)# 激活生成器
    for i in range(10):
        print("生产了数据:",i)
        c.send(i)
        
producer()


生产了数据: 0
处理了数据: 0
生产了数据: 1
处理了数据: 1
生产了数据: 2
处理了数据: 2
生产了数据: 3
处理了数据: 3
生产了数据: 4
处理了数据: 4
生产了数据: 5
处理了数据: 5
生产了数据: 6
处理了数据: 6
生产了数据: 7
处理了数据: 7
生产了数据: 8
处理了数据: 8
生产了数据: 9
处理了数据: 9
# greenlet模块就是真正的协程 模块
from greenlet import greenlet
def eat():
    print("Eating start")
    g2.switch() # 多任务之间的切换
    print("Eating end")
    g2.switch()  # 多任务之间的切换
def play():
    print("Playing start")
    g1.switch()  # 多任务之间的切换
    print("Playing end")
g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch()


Eating start
Playing start
Eating end
Playing end
# Gevent模块——join,spawn,value三种方法
# g1 = gevent.spawn(func,1,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,后面可以有多个参数,可以是位置实参或关键字实参,都是传递给函数的
# g2 = gevent.spawn(func2)
# g1.join() 等待g1结束
# g2.join() 等待g2结束
# 上述两步合作一步——gevent.joinall([g1,g2])
# g1.value 拿到func1的返回值

# from gevent import monkey;monkey.patch_all()
import time
import gevent
import threading

def
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值