协程

协程也是单线程的一种,协程是针对程序级别来说的,假如python中一个function是一个程序,协程就是在程序之间来回切换,从一个func1中断去执行func2后回来继续执行func1,这就是协程。

协程优点:

  • 无需上下文之间的线程的切换开销,所以可以提高性能
  • 不需要加锁
  • 高并发+高扩展很容易实现高并发

缺点:

  • 无法利用多核资源
  • 进行阻塞时会阻塞掉整个程序

yield实现协程

def a(name):
    print("开始执行a func")
    while True:
        print("\033[31;1m[name is] %s\033[0m " % name)
        bone = yield
        print("name is [%s] num is [%s]" % (name, bone))


def b(obj1, obj2):
    obj1.__next__()   
    obj2.__next__()    
    n = 0
    while n < 5:
        n += 1
        print("\033[32;1m[b is runing a]\033[num is %s" % n)
        obj1.send(n)
        obj2.send(n)


if __name__ == '__main__':
    o1 = a("s")
    o2 = a("c")
    print("xxxx")
    b(o1, o2)


++++++++++++++++++++++++++++++++++++++输出===============================
xxxx
开始执行a func
[name is] s 
开始执行a func
[name is] c 
[b is runing a]um is 1
name is [s] num is [1]
[name is] s 
name is [c] num is [1]
[name is] c 
[b is runing a]um is 2
name is [s] num is [2]
[name is] s 
name is [c] num is [2]
[name is] c 
[b is runing a]um is 3
name is [s] num is [3]
[name is] s 
name is [c] num is [3]
[name is] c 
[b is runing a]um is 4
name is [s] num is [4]
[name is] s 
name is [c] num is [4]
[name is] c 
[b is runing a]um is 5
name is [s] num is [5]
[name is] s 
name is [c] num is [5]
[name is] c 

greenlet 实现的协程

from greenlet import greenlet

def a():
    print("a a a 1 1 1")
    glet2.switch()
    print("a a a 2 2 2")
    glet2.switch()

def b():
    print("b b b 1 1 1")
    glet1.switch()
    print("b b b 2 2 2")

glet1 = greenlet(a)
glet2 = greenlet(b)
glet1.switch()

=======================================输出=======================================
a a a 1 1 1
b b b 1 1 1
a a a 2 2 2
b b b 2 2 2

green 实现协程

import gevent

def a():
    print("a running")
    gevent.sleep(2)           
    print("switch a")

def b():
    print("b running")
    gevent.sleep(1)
    print("switch b")

def c():
    print("c  running")
    gevent.sleep(0)
    print("c done..")

gevent.joinall([gevent.spawn(a),
                gevent.spawn(b),
                gevent.spawn(c),
                ])

=======================================输出===================================
a running
b running
c  running
c done..
switch b
switch a

gevent 同步和异步

import gevent
import time

def task(i):
    gevent.sleep(0.5)
    print("task %s done time is %s"%(str(i),str(time.time())))

def tongbu():
    for i in range(5):
        task(i)

def yibu():
    gtks = [gevent.spawn(task,i) for i in range(5)]
    gevent.joinall(gtks)

print("start tongbu")
tongbu()
===================================输出==============================
start tongbu
task 0 done time is 1617109547.8825037
task 1 done time is 1617109548.383137
task 2 done time is 1617109548.8833303
task 3 done time is 1617109549.3839643
task 4 done time is 1617109549.8845973
yibu
task 0 done time is 1617109550.385385
task 1 done time is 1617109550.3854475
task 2 done time is 1617109550.3854609
task 3 done time is 1617109550.38547
task 4 done time is 1617109550.3854783

gevent 未完待续。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值