协程也是单线程的一种,协程是针对程序级别来说的,假如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 未完待续。。。。