yield、greenlet、gevent

1,协程yield
比线程更小的执行单元,自带cpu上下文,

线程与进程是操作系统分配,cpu调度

线程非常耗性能

协程一秒钟可以上百万次

用yielg可以实现协程,但是基本不用,因为需要手动操作,极其麻烦

import time

def work_1():
    while True:
        print('work1')
        time.sleep(0.1)
        yield

def work_2():
    while True:
        print('work2')
        time.sleep(0.1)
        yield

def main():
    t1 = work_1()
    t2 = work_2()
    #先让t1运行一会儿,当t1中遇到yield的时候,再返回到24行,然后执行t2,当它遇到yield的时候,再次切换到t1中,这样t1/t2/t1/t2交替执行,最终实现多任务协程。
    while True:#相当于任务分配者
        next(t1)
        next(t2)

if __name__ == '__main__':
    main()

2,协程greenlet(半自动)
需要使用遍历

from greenlet import greenlet
import time

def work1():
    while True:
        print('work1')
        g2.switch()
        time.sleep(0.1)  # 模拟将来可能会出现的耗时操作


def work2():
    while True:
        print('work2')
        g1.switch()
        time.sleep(0.1)

if __name__ == '__main__':
    # 创建协程
    g1 = greenlet(work1)
    g2 = greenlet(work2)
    # 切换到g1,g2中进行运行
    g1.switch()
    g2.switch()

    while True:
        next(g1)
        next(g2)

3,协程gevent(全自动)
全自动协程

import gevent

def func(num):
    for i in range(num):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)

g1 = gevent.spawn(func, 5)
g2 = gevent.spawn(func, 6)
g3 = gevent.spawn(func, 7)
g1.join()  # 等待g1执行完
g2.join()
g3.join()
遇到延时就切换,
import gevent

def func1(num):
    for i in range(num):
        print(gevent.getcurrent(), i)
        
def func2(num):
    for i in range(num):
        print(gevent.getcurrent(), i)

def func3(num):
    for i in range(num):
        print(gevent.getcurrent(), i)


print('111111')
g1 = gevent.spawn(func1, 5)#创建对象,
print('222222')

g2 = gevent.spawn(func2, 6)
print('333333')

g3 = gevent.spawn(func3, 7)
print('444444')

g1.join()
g2.join()
g3.join()

111111
222222
333333
444444
<Greenlet at 0x1be87990248: func1(5)> 0
<Greenlet at 0x1be87990248: func1(5)> 1
<Greenlet at 0x1be87990248: func1(5)> 2
<Greenlet at 0x1be87990248: func1(5)> 3
<Greenlet at 0x1be87990248: func1(5)> 4
<Greenlet at 0x1be87990548: func2(6)> 0
<Greenlet at 0x1be87990548: func2(6)> 1
<Greenlet at 0x1be87990548: func2(6)> 2
<Greenlet at 0x1be87990548: func2(6)> 3
<Greenlet at 0x1be87990548: func2(6)> 4
<Greenlet at 0x1be87990548: func2(6)> 5
<Greenlet at 0x1be87990648: func3(7)> 0
<Greenlet at 0x1be87990648: func3(7)> 1
<Greenlet at 0x1be87990648: func3(7)> 2
<Greenlet at 0x1be87990648: func3(7)> 3
<Greenlet at 0x1be87990648: func3(7)> 4
<Greenlet at 0x1be87990648: func3(7)> 5
<Greenlet at 0x1be87990648: func3(7)> 6


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值