yield可以手工实现协程,但python为我们封装了一个greenlet,先看看yield实现,yield需要手工操作,无法实现IO操作时自动切换协程,greenlet是封装好的,能方便使用io切换!
import
time
import
queue
def
consumer(name):
print
(
"--->starting eating baozi..."
)
while
True
:
new_baozi
=
yield
print
(
"[%s] is eating baozi %s"
%
(name,new_baozi))
#time.sleep(1)
def
producer():
r
=
con.__next__()
r
=
con2.__next__()
n
=
0
while
n <
5
:
n
+
=
1
con.send(n)
con2.send(n)
print
(
" 33[32;1m[producer] 33[0m is making baozi %s"
%
n )
if
__name__
=
=
'__main__'
:
con
=
consumer(
"c1"
)
con2
=
consumer(
"c2"
)
p
=
producer()
方法二
greenlet实现方法:
greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
安装方法:
pip install greenle
如何使用请看下面例子!
from
greenlet
import
greenlet
def
test1():
print
(
12
)
gr2.switch()#手工切换
print
(
34
)
gr2.switch()#手工切换
def
test2():
print
(
56
)
gr1.switch()
print
(
78
)
gr1
=
greenlet(test1)
gr2
=
greenlet(test2)
gr1.switch() #手工切换
Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
import
gevent
def
func1():
print
(
' 33[31;1m李闯在跟海涛搞... 33[0m'
)
gevent.sleep(
2
)
print
(
' 33[31;1m李闯又回去跟继续跟海涛搞... 33[0m'
)
def
func2():
print
(
' 33[32;1m李闯切换到了跟海龙搞... 33[0m'
)
gevent.sleep(
1
)
print
(
' 33[32;1m李闯搞完了海涛,回来继续跟海龙搞... 33[0m'
)
gevent.joinall([
gevent.spawn(func1),
gevent.spawn(func2),
#gevent.spawn(func3),
])